stream和buffer的概念解析

1.概念解析

buffer:内存中一块确定的临时存储区域。
stream:一段不确定长度的数据序列,可以认为stream就是I/O中input部分的FIFO实现,为了方便理解,可以用键盘输入作为输入来举例,从键盘中敲入的字符组成一段stream,先敲入的字符先被读取,也就是FIFO,但是读取的过程中,你并不知道总共要读取多少,也就是长度的不确定性。

2.具体使用时的区别与联系

在使用 stream 的过程中,我们遵循这样一个基本的过程,以从文件中读取为例:
1.程序向 stream 发起请求,要读取一个字节。
2.stream 在磁盘上定为到请求的字节,并发送给程序。
3.程序得到这个字节后,在进行请求,重复到第一步

这个样子就有一个很严重的效率问题,读取一个字节需要在程序和stream之间来回一次,那么1000个字节就是1000次。怎么解决这个问题呢?

这时候就到 buffer 出场了,buffer 根据上面的概念,他是内存中一块确定的临时存储区域。如果使用一个 1000 字节的 buffer ,那么程序和 stream 的关系就变成:
1.程序向stream发起请求,要求stream将buffer填满。
2.stream向buffer中填充字节,要么填满1000个字节为止,要么stream到达结尾为止。
3.程序从buffer中一次性获取1000字节的数据

很明显,使用buffer的好处在于减少的请求IO的次数,也大大提升了效率

《stream和buffer的概念解析》上有3条评论

  1. 像是Buffer的大小设置多少算合理呢,有没有一些参考,比如文章中举例的是1000字节之后进行一次io操作。如果说是一个很大的文件,10G这么大,buffer设置到多少合适,或者文件适量,比如3M左右,buffer;

    并且buffer的设置大小要参考哪些属性么?比如说带宽、还是内存?(猜测是内存,如果buffer过大会导致内存溢出的吧)

    1. 一般不会有一个确定的值适合所有的场景。根据业务,机器配置等实际情况去观察,逐渐去调整到一个合适的值就行。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据