【Go学习笔记】带缓冲IO的bufio包
带缓冲的IO
bufio.Scanner
Scanner为读取数据提供了一些方便的接口,通过切割方法可以逐字节,逐字,逐词组,逐行读取,某些场景下使用scanner可以很方便的解决问题。
1 | func main() { |
运行示例
1 | 请输入内容:a b c |
bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。
bufio.Readder
缓冲读的大致过程如下,设定好缓冲区大小buf_size后,读取的字节数为rn,缓冲的字节数为bn:
- 如果缓冲区为空,且
rn >= buf_size,则直接从文件读取,不启用缓冲。 - 如果缓冲区为空,且
rn < buf_size,则从文件读取buf_size字节的内容到缓冲区,程序再从缓冲区中读取rn字节的内容,此时缓冲区剩余bn = buf_size - rn字节。 - 如果缓冲区不为空,
rn < bn,则从缓冲区读取rn字节的内容,不发生文件IO。 - 如果缓冲区不为空,
rn >= bn,则从缓冲区读取bn字节的内容,不发生文件IO,缓冲区置为空,回归1/2步骤。
缓冲读通过预读,可以在一定程度上减少文件IO次数,故提高性能
代码示例
1 | func main() { |
要注意的是当缓冲区中有内容时,程序的此次读取都会从缓冲区读,而不会发生文件IO。只有当缓冲区为空时,才会发生文件IO。如果缓冲区的大小足够,则启用缓冲读,先将内容载入填满缓冲区,程序再从缓冲区中读取。如果缓冲区过小,则会直接从文件读取,而不使用缓冲读。
bufio.Writer
缓冲写的大致过程如下,设定好缓冲区大小buf_size后,写入的字节数为wn,缓冲的字节数为bn:
- 如果缓冲区为空,且
wn >= buf_size,则直接写入文件,不启用缓冲,发生文件IO。 - 如果缓冲区为空,且
wn < buf_size,则程序将内容写入缓冲区,不发生文件IO。 - 如果缓冲区不为空,
wn + bn < buf_size,则程序将内容写入缓冲区,不发生文件IO。 - 如果缓冲区不为空,
wn + bn >= buf_size,则缓冲区将buf_size字节内容写入文件,缓冲区wn + bn - buf_size的剩余内容。
简单说就是要写入的内容先缓冲着,缓冲不下了则将缓冲区内容写入文件。
代码示例
1 | func main() { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mr.Pu 个站博客!
评论









