bufio 包实现了缓存IO。它包装了 io.Reader 和 io.Writer 对象,创建了另外的Reader和Writer对象,它们也实现了 io.Reader 和 io.Writer 接口,不过它们是有缓存的。

ReadLine可以读取单独的行,一般读文件的时候,我就使用它,但由于缓存的问题,造成使用上出了些问题。

bufio默认缓存大小为4096个字节,但由于我读取的文件某行大于这个数,导致ReadLine竟没有读完整,这让我感觉很奇怪,后来想到很可能是缓存大小的问题,使用NewReaderSize函数重设缓存后,程序表现正常。

经了解,ReadLine尝试返回单独的行,不包括行尾的换行符("\r\n"或者"\n")。

如果一行大于缓存,isPrefix会被设置为 true,返回已经读到的数据(缓存填满),剩下的数据等待再次调用函数去读取。下次重复这个操作,直到读完整行数据,isPrefix将会被设置为 false

1
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

这样的操作,我感觉不符合我预期想要的结果,我不管你的缓存大小,我只想要一行,一行就是一行而已。所以可以这样做。

这样做,就不会由于缓存大小问题而只返回缓存部分了,而是一行有多长,就给你返回多长数据。

1
2
3
4
5
6
7
// ReadBytes 读到什么标志为终止
line, err := reader.ReadBytes('\n')
// 去掉末尾 \r和\n
line = bytes.TrimRight(line, "\r\n")

a1, err := br.ReadString('\n')
strings.TrimRight(a1, "\r\n")