42 | bufio包中的数据类型 (上)
郝林

今天,我们来讲另一个与 I/O 操作强相关的代码包bufio。bufio是“buffered I/O”的缩写。顾名思义,这个代码包中的程序实体实现的 I/O 操作都内置了缓冲区。
bufio包中的数据类型主要有:
Reader;
Scanner;
Writer和ReadWriter。
与io包中的数据类型类似,这些类型的值也都需要在初始化的时候,包装一个或多个简单 I/O 接口类型的值。(这里的简单 I/O 接口类型指的就是io包中的那些简单接口。)
下面,我们将通过一系列问题对bufio.Reader类型和bufio.Writer类型进行讨论(以前者为主)。今天我的问题是:bufio.Reader类型值中的缓冲区起着怎样的作用?
这道题的典型回答是这样的。
bufio.Reader类型的值(以下简称Reader值)内的缓冲区,其实就是一个数据存储中介,它介于底层读取器与读取方法及其调用方之间。所谓的底层读取器,就是在初始化此类值的时候传入的io.Reader类型的参数值。
Reader值的读取方法一般都会先从其所属值的缓冲区中读取数据。同时,在必要的时候,它们还会预先从底层读取器那里读出一部分数据,并暂存于缓冲区之中以备后用。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》,新⼈⾸单¥59
《Go 语言核心 36 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 人生入戏须尽欢bufio和bytes.buffer有什么区别吗
作者回复: bufio 包中的 Reader 和 Writer 的主要作用是在已有的 IO 读取器或者写入器之上再包一层缓冲区,是面向 IO 操作。而 bytes.Buffer 是基于字节数组的缓冲区,是面向纯内存的。
322 - 鲲鹏飞九万里赫老师,您好。这段话,您写得是不是有问题,我读了好几遍也不能理解。能否详细讲解下: “第二个事实,在压缩缓冲区之后,已写计数之后的字节只可能是已被读取过的字节,或者是已被拷贝到缓冲区头部的未读字节,又或者是代表未曾被填入数据的零值0x00。所以,后续的新字节是可以被写到这些位置上的。”
作者回复: 这里说的是,以“已写计数”这个指针为界线,在缓冲区经过压缩之后,它后面会是什么样的数据。 1. 在压缩之后,在该指针之后有可能是已经被读取过的旧数据。正因为这些数据在该指针指向的位置之后,所以压缩时并不会清除它们,等到写入新数据时自然也就被覆盖掉了; 2. 在压缩之后,在该指针之后的数据也可能是那些(由于压缩的进行)已经被拷贝到缓冲区头部的(还未被读取的)数据,这些数据同样可以被后来的新数据覆盖掉,因为缓冲区头部已经存在这些数据了; 3. 在压缩之后,在该指针之后的数据还可能是“初始状态”的,因为那些数据槽位还没有被用到过,所以它们才是“初始状态”,如果某个数据槽位被用过的话,就会是前两种情况中的任意一种了。 首先,你要理解前面说的缓冲区数据压缩是做什么的,会有哪些具体操作,然后再来理解这里的含义。简单来说,压缩其实就是,删掉那些在缓冲区头部的、已经被读取过的数据,然后把后边的未读数据拷贝到缓冲区的头部。你可以再好好理解一下。
归属地:北京21 - lesserror郝林老师你好。 请问一下,demo84.go中:示例4和示例5中,为什么调用Peek方法最后返回的字节切片的长度都为213呀。我想的是示例5中应该返回300才对的呀。
作者回复: 这是因为底层的 reader 中总共只有 213 个字符啊,这与 buffer 的大小没有关系,要看有多少个字符是真正存在的。
1 - 小刚zbufio有并发都写的问题吗 看起来好像没有
作者回复: bufio 没有自带锁,你要是想并发的话,需要自己加锁。
归属地:广东 - 到不了的塔bufio的应用场景应该是为了加快io速度,尤其是对比较零碎的数据(小数据)的io加速更明显。13
- Cloud老师,什么场景适合使用bufio,能否举几个栗子呀17
- 疯琴对照源码看专栏,好理解好记忆。👍3
- Wiwen如果Write方法发现需要写入的字节太多,同时缓冲区已空,直接写到底层写入器。 这个写入字节应该是新要写入的字节大小超过了缓存区的大小(默认值是4096)时,才直接写到底层写入器。
收起评论