文件打开
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] )
}
}
dstBuf. Flush ( )
return
}