一、不安全逐行读取gzip文件
- gzip.NewReader创建一个gzip文件输入对象
- bufio.NewReader创建一个带有固定缓冲区大小的文件输入对象
func ReadLine(file *os.File) (string, error) {
reader, err := gzip.NewReader(file)
if err != nil {
return "", err
}
bufReader := bufio.NewReader(reader)
line, _, err := bufReader.ReadLine()
if err != nil {
return "", err
}
return string(line), nil
}
此方法存在一定的问题,在bufio.NewReader时,系统默认缓冲区大小为defaultBufSize = 4096,因此如果一行字符串长度大于4096,那么ReadLine时会被截断。
// NewReader returns a new Reader whose buffer has the default size.
func NewReader(rd io.Reader) *Reader {
return NewReaderSize(rd, defaultBufSize)
}
解决方法:
- 根据Readline返回值判断是否被截断,如果截断,则接续读取
- 使用ReadBytes或ReadString方法
二、安全逐行读取
逐行读取,知道读取指定字符时返回,因此,如果逐行读取,则delim设置为换行符’\n’即可。
func (b *Reader) ReadString(delim byte) (string, error) {
bytes, err := b.ReadBytes(delim)
return string(bytes), err
}