日期:2014-05-20  浏览次数:20692 次

java字节流读写文件的效率问题
本帖最后由 touchthefuturer 于 2014-04-13 15:45:57 编辑
//1.单字节直接读写
int chs = 0 ;
while((chs=fis.read()) != -1){
fos.write(chs);

 
//2.数组读写?
byte[] buf = new byte[1024];
int len = 0 ;
while((len=fis.read(buf)) != -1){
fos.write(buf,0,len);


//3.buffer单字节读写
int chs = 0 ;
while((chs=bufis.read()) != -1){
bufos.write(chs);


//4.buffer数组读写
byte[] buf = new byte[1024];  
int len = 0 ;
while((len=bufis.read(buf)) != -1){
bufos.write(buf,0,len);
bufos.flush();
  

为什么用缓冲区的时候,单字节读写和数组读写效率几乎没区别(3和4)
而不使用缓冲区的时候,单字节和数组读写效率差别这么大(1和2)
2中自定义的数组和4中的缓冲区数组是一样的吗?
------解决方案--------------------
1. 使用buffer时,无论单字节还是数组读写都是从buffer中读数据或者写数据到buffer,这些操作都在内存中进行,因此差异不会很大。
2. 不使用buffer时,读写操作直接操控stream或者reader,相当于直接读写磁盘;数组读写相对于单字节来说相当于批量读写,因此速度会快,但相对于使用buffer来说,应该会慢不少,至少从读写的稳定性或者cpu的利用率上来说,是不如使用buffer的。
------解决方案--------------------
第一种和第二种都是直接写的磁盘,区别在于第二种一次往磁盘文件中写入了1024个字节,而第一种方法则需要写1024次,虽然文件流没有关闭,但是读写磁盘,每次都是需要重新向操作系统申请的(具体怎么回事也不清楚。。),这样会消耗更多的资源
第三种和第四种,其实原理一样,先写到缓存中,然后一次写到磁盘文件,第三种虽然是逐个字节的写,但是buff流是默认会有缓冲的,就是说它不会在你每次写入的时候就写到磁盘中,它只会保存在内存,等流关闭或者你手动flush的时候再写磁盘