golang 文件读写汇总

文件打开
os.Open() 返回只读模式的文件描述符
os.OpenFile(filename, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
 
 O_RDONLY:只读模式(read-only)
 O_WRONLY:只写模式(write-only)
 O_RDWR:读写模式(read-write)
 O_APPEND:追加模式(append)
 O_CREATE:文件不存在就创建(create a new file if none exists.)
 O_EXCL:与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must not exist)
 O_SYNC:同步方式打开,即不使用缓存,直接写入硬盘
 O_TRUNC:打开并清空文件
文件读写
os包
f, err := os.OpenFile():     f.Read()     走系统调用 性能较低
    写:     f.Write()    走系统调用 性能较低

ioutil包
    读文件  ReadAll/ReadFile    读取整个文件 不适合大文件
    写文件  WriteFile()

bufio包 (常用的包,读写接口灵活)
    读文件  n, err := Read(p []byte)    按块读取 注意此函数返回的读取长度 p[0:n]才是每次读取的内容
            ReadLine()                  默认缓冲区为4096 如果有长度>4096的行 不建议用此函数
            ReadBytes('\n')             指定分隔符读取 
            ReadString('\n')            指定分隔符读取
                总之 如果按快读取用Read 按行读取用ReadBytes或ReadString 谨慎使用ReadLine
    写文件  Write/WriteString/WriteByte/WriteRune   支持字节串 字符串 单字节 utf-8 用完记得write.Flush()
大文件读取的两种方式
1 逐行读取
func loadToFile(src io.Reader, dst io.Writer) {
	srcBuf := bufio.NewReader(src)
	dstBuf := bufio.NewWriter(dst)

	for {
		switch bs, err := srcBuf.ReadBytes('\n'); true {
		case err != nil && err != io.EOF:
			logging.Errorf("read err=%s", err.Error())
			return
		case err == io.EOF:
			return
		default:
			dstBuf.Write(bs)
		}
	}

	dstBuf.Flush()

	return
}

line, err := br.ReadLine()
如果一行超过4096则会截断
建议用 br.ReadString('\n') 或者 br.ReadBytes()
2 分片读取
func LoadToFileWithBuffer(src io.Reader, dst io.Writer, buffer []byte) {
	srcBuf := bufio.NewReader(src)
	dstBuf := bufio.NewWriter(dst)

	for {
		switch n, err := srcBuf.Read(buffer[:]); true {
		case n < 0:
			logging.Errorf("read err=%s", err.Error())
			return
		case n == 0:
			return
		case n > 0:
			dstBuf.Write(buffer[0:n])    // 不能dst.Write(buffer)  有可能读不满
		}
	}

	dstBuf.Flush()
	
	return
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值