简单解析下bufio包原理和读写流程
bufio 是通过缓冲来提高效率。首先提供了缓冲区(分配一块内存),读和写都先在缓冲区中,最后再读写文件,来降低访问本地磁盘的次数,从而提高效率
简单的说就是,把文件读取进缓冲(内存)之后再读取的时候就可以避免文件系统的io从而提高速度。同理,在进行写操作时,先把文件写入缓冲(内存),最后一口气把缓冲区内容写入文件
Reader对象
bufio.Reader 是bufio中对io.Reader 的封装
1 | // Reader implements buffering for an io.Reader object. |
bufio.Read(p []byte) 相当于读取大小len(p)的内容,步骤如下:
- 当缓存区有内容的时,将缓存区内容全部填入p并清空缓存区
- 当缓存区没有内容的时候且len(p)>len(buf),即要读取的内容比缓存区还要大,直接去文件读取
- 当缓存区没有内容的时候且len(p)<len(buf),即要读取的内容比缓存区小,缓存区从文件读取内容充满缓存区,并将p填满(此时缓存区有剩余内容)
- 以后再次读取时缓存区有内容,将缓存区内容全部填入p并清空缓存区(此时和情况1一样)
源码如下:
1 | // Read reads data into p. |
Writer对象
bufio.Writer 是bufio中对io.Writer 的封装
1 | // Writer implements buffering for an io.Writer object. |
bufio.Write(p []byte) 的步骤如下:
- 判断buf中可用容量是否可以放下p(缓存区充足)
- 如果能放下,直接把p拼接到buf后面,即把内容放到缓冲区
- 如果缓冲区的可用容量不足以放下,且此时缓冲区是空的,直接把p写入文件即可
- 如果缓冲区的可用容量不足以放下,且此时缓冲区有内容,则用p把缓冲区填满,把缓冲区所有内容写入文件,并清空缓冲区(Flush);判断p的剩余内容大小能否放到缓冲区,如果能放下(此时和步骤1情况一样)则把内容放到缓冲区;如果p的剩余内容依旧大于缓冲区(注意此时缓冲区是空的,情况和步骤3一样),则把p的剩余内容直接写入文件
- 当所有写入完成后,因为缓存区会存储内容,所以需要手动flush()到文件
源码如下:
1 | // Write writes the contents of p into the buffer. |