字节流与缓冲流,怎样实现高效率的?

时间:2023-01-11 18:07:49
看了InputStream和BufferedInputStream,实现缓冲其实就是定义的下面的这个字节数组
protected volatile byte buf[]; 问题是把数据读到这个字节数组里面不依然一个字节一个字节调用的InputStream.read()吗?!那节约效率是怎么来的呢?

9 个解决方案

#1


我的理解是这样的,不用缓冲的话,也就是没有那个数组,是读一个字符,就要输出一下,读一个字符输出一下,但是如果读到缓冲区,那就可以把缓冲区读满然后输出一次,这样效率就提高了

#2


问题是  输出也是循环调用的OutputStream.write()的呀

#3


上面说的有道理  就是为了减少次数  比如你想买点零食  每次去买一袋  买100次  和每次买10袋  买10次  肯定是后者效率高
不是说读的快  同样的硬件读肯定是一样的  而是交换的次数少

#4


比如你现在要往一个文件里写,你如果不用缓冲流,就要频繁的打开文件流,这样非常耗时,所以使用缓冲流可以缓解。就比如,你要去学校的开水房打水,如果你去一杯一杯的打开水也可以,如果想快就提一个电壶过去打一壶(缓冲流)。

#5


对啊~
一个时间全部花在路上了。。。

#6


读一点 写一点 就相当于 硬盘磁头动一下 停一下 效率太低了

#7


引用 6 楼 sc6231565 的回复:
读一点 写一点 就相当于 硬盘磁头动一下 停一下 效率太低了


好形象啊,反正就是确保你在准备请求磁盘开始读取文件时,有足够的位置存放磁头一次访问读取到的数据,不要出现放不下丢弃的数据,因为磁头一次读取一个扇区的数据,至少 512字节,如果你装不下就丢弃了,下次重新再来一次,同样写出数据也是一样的过程,一次能写出一个扇区的数据,如果你数据不够分多次,磁头就需要多等物理设置转几圏 。

#8


这两天也正学缓冲流呢、我的理解是这样的、
Java源于生活、比如你去邮寄东西、邮局肯定是等往一个地方的邮件达到一定数量后才会出车、不可能一封就出一次车、
既然这样、JVM也是一样的、它会等数据达到一定数量时一次性读或者写、而不会因为一个字节或者字符而进行读写、那样太浪费资源了、而且硬盘容易坏、

#9


看源码   跟错了  buffered不是调用的inputstream的read  而是这个
private native int readBytes(byte b[], int off, int len) throws IOException;

#1


我的理解是这样的,不用缓冲的话,也就是没有那个数组,是读一个字符,就要输出一下,读一个字符输出一下,但是如果读到缓冲区,那就可以把缓冲区读满然后输出一次,这样效率就提高了

#2


问题是  输出也是循环调用的OutputStream.write()的呀

#3


上面说的有道理  就是为了减少次数  比如你想买点零食  每次去买一袋  买100次  和每次买10袋  买10次  肯定是后者效率高
不是说读的快  同样的硬件读肯定是一样的  而是交换的次数少

#4


比如你现在要往一个文件里写,你如果不用缓冲流,就要频繁的打开文件流,这样非常耗时,所以使用缓冲流可以缓解。就比如,你要去学校的开水房打水,如果你去一杯一杯的打开水也可以,如果想快就提一个电壶过去打一壶(缓冲流)。

#5


对啊~
一个时间全部花在路上了。。。

#6


读一点 写一点 就相当于 硬盘磁头动一下 停一下 效率太低了

#7


引用 6 楼 sc6231565 的回复:
读一点 写一点 就相当于 硬盘磁头动一下 停一下 效率太低了


好形象啊,反正就是确保你在准备请求磁盘开始读取文件时,有足够的位置存放磁头一次访问读取到的数据,不要出现放不下丢弃的数据,因为磁头一次读取一个扇区的数据,至少 512字节,如果你装不下就丢弃了,下次重新再来一次,同样写出数据也是一样的过程,一次能写出一个扇区的数据,如果你数据不够分多次,磁头就需要多等物理设置转几圏 。

#8


这两天也正学缓冲流呢、我的理解是这样的、
Java源于生活、比如你去邮寄东西、邮局肯定是等往一个地方的邮件达到一定数量后才会出车、不可能一封就出一次车、
既然这样、JVM也是一样的、它会等数据达到一定数量时一次性读或者写、而不会因为一个字节或者字符而进行读写、那样太浪费资源了、而且硬盘容易坏、

#9


看源码   跟错了  buffered不是调用的inputstream的read  而是这个
private native int readBytes(byte b[], int off, int len) throws IOException;