【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 个站博客!
评论