IO流中,用缓冲类有什么好处?

时间:2021-05-26 21:32:36
不用缓冲类的情况下,用字符/字节数组转存数据”和“ 用缓冲类,用字符/字节数组转存数据”,有什么区别?

经过测试,若逐字节读写,一个4M的图片,用缓冲区的速度是不用缓冲区的几十倍。然而,用数组转存的情况下,二者速度相当。

所以说,既然不用缓冲类、用数组转存数据
(new FileInputStream("...")).read(byteArr);

(new FileOutputStream("...")).write(byteArr,0,len);

效率和用缓冲类、用数组转存数据
(new BufferedInputStream(new FileInputStream("..."))).read(byteArr);

(new BufferedOutputStream(new FileOutputStream("..."))).write(byteArr,0,len);

相当,那么,用缓冲类又有什么好处呢?

14 个解决方案

#1


inputstream   类都以字节传输,开一次车拉一个字节给你,,速度比较慢。缓冲流好比开一个车每次拉一堆字节,然后一个一个拿给你,所以效率会高一些

#2


引用 1 楼 CN01769614 的回复:
inputstream   类都以字节传输,开一次车拉一个字节给你,,速度比较慢。缓冲流好比开一个车每次拉一堆字节,然后一个一个拿给你,所以效率会高一些

这个我是知道的,麻烦看下问题描述,别只看标题啊。。
InputStream类用字符数组读写的时候,也是一样的一次一堆字节

#3


缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

#4


引用 3 楼 soton_dolphin 的回复:
缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

可是这个快也只是相对于InputStream类单字节读入的吧。。像我说的那样,都用字节数组读入的话,速度好像没什么区别。。
也可能是文件太小了,我用一个视频试一下

#5


引用 4 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

可是这个快也只是相对于InputStream类单字节读入的吧。。像我说的那样,都用字节数组读入的话,速度好像没什么区别。。
也可能是文件太小了,我用一个视频试一下


读取文件的原始字节是很耗时的,比如BufferedInputStream 有一个两兆的缓冲内存,那么在程序读着两兆字节期间就不会再去原文件里获取原始字节了。BufferedInputStream 默认的内存大小是8192 bytes.

#6


引用 3 楼 soton_dolphin 的回复:
缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???

#7


引用 6 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

#8


引用 6 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???

啊  不好意思。。刚刚多注释了一行。。改了之后发现两种方法都是380ms左右,还是没什么区别。。

#9


引用 7 楼 soton_dolphin 的回复:
Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。

#10


引用 9 楼 u010004204 的回复:
Quote: 引用 7 楼 soton_dolphin 的回复:

Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。


可以用 int read(byte[]) 测试一下

#11


因为类比较高大上  你把代码贴出来看看.. IO流中,用缓冲类有什么好处? 

#12


你也是个纠结蛋疼的人

#13


引用 9 楼 u010004204 的回复:
Quote: 引用 7 楼 soton_dolphin 的回复:

Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。
哪种比较好用,我用的这个FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);      
//创建一个缓冲区        
byte buffer[] = new byte[1024];       
//判断输入流中的数据是否已经读完的标识       
int len = 0;       
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据        
while((len=in.read(buffer))>0){        
    
out.write(buffer, 0, len);     
}        

#14


大数据用缓冲流,小的可以不需要用缓冲流想当与中转站一样,等资源积累到一定的额度在一起读写,省资源吧

#1


inputstream   类都以字节传输,开一次车拉一个字节给你,,速度比较慢。缓冲流好比开一个车每次拉一堆字节,然后一个一个拿给你,所以效率会高一些

#2


引用 1 楼 CN01769614 的回复:
inputstream   类都以字节传输,开一次车拉一个字节给你,,速度比较慢。缓冲流好比开一个车每次拉一堆字节,然后一个一个拿给你,所以效率会高一些

这个我是知道的,麻烦看下问题描述,别只看标题啊。。
InputStream类用字符数组读写的时候,也是一样的一次一堆字节

#3


缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

#4


引用 3 楼 soton_dolphin 的回复:
缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

可是这个快也只是相对于InputStream类单字节读入的吧。。像我说的那样,都用字节数组读入的话,速度好像没什么区别。。
也可能是文件太小了,我用一个视频试一下

#5


引用 4 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

可是这个快也只是相对于InputStream类单字节读入的吧。。像我说的那样,都用字节数组读入的话,速度好像没什么区别。。
也可能是文件太小了,我用一个视频试一下


读取文件的原始字节是很耗时的,比如BufferedInputStream 有一个两兆的缓冲内存,那么在程序读着两兆字节期间就不会再去原文件里获取原始字节了。BufferedInputStream 默认的内存大小是8192 bytes.

#6


引用 3 楼 soton_dolphin 的回复:
缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???

#7


引用 6 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

#8


引用 6 楼 u010004204 的回复:
Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???

啊  不好意思。。刚刚多注释了一行。。改了之后发现两种方法都是380ms左右,还是没什么区别。。

#9


引用 7 楼 soton_dolphin 的回复:
Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。

#10


引用 9 楼 u010004204 的回复:
Quote: 引用 7 楼 soton_dolphin 的回复:

Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。


可以用 int read(byte[]) 测试一下

#11


因为类比较高大上  你把代码贴出来看看.. IO流中,用缓冲类有什么好处? 

#12


你也是个纠结蛋疼的人

#13


引用 9 楼 u010004204 的回复:
Quote: 引用 7 楼 soton_dolphin 的回复:

Quote: 引用 6 楼 u010004204 的回复:

Quote: 引用 3 楼 soton_dolphin 的回复:

缓冲到一个临时的缓冲内存里面,再读入的时候就会很快

我刚刚又测试了一下,将一个150M的视频复制
用FileInputStream类和FileOutputStream类,用byte[1024*1024]进行读写,只需要80ms左右
用BufferedInputStream类和BufferedOutputStream类,也是用byte[1024*1024]进行读写,要花380ms左右。。
用缓冲区类反而更慢???


你的测试环境都不一样,跑两个程序的时候,CPU, 内存是使用率是不是一样?这么测试得出的结论不科学

刚刚不小心多注释了一行所以弄错了。。又重新试了下两种方法都是380ms左右,因为是反复运行多次得出的平均值,所以还是比较可信的吧。。
哪种比较好用,我用的这个FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);      
//创建一个缓冲区        
byte buffer[] = new byte[1024];       
//判断输入流中的数据是否已经读完的标识       
int len = 0;       
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据        
while((len=in.read(buffer))>0){        
    
out.write(buffer, 0, len);     
}        

#14


大数据用缓冲流,小的可以不需要用缓冲流想当与中转站一样,等资源积累到一定的额度在一起读写,省资源吧