BufferedInputStream和BufferedOutputStream
FileInputStream与BufferedInputStream区别:
BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。
FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节,执行read时先从缓冲区读取,当缓冲区数据读完时再把缓冲区填满。),因此,当每次读取的数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高,且FileInputStream对象的read方法会出现阻塞;BufferedInputStream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。BufferedOutputStream和FileOutputStream同理,差异更明显一些。
FileInputStream和FileOutputStream
1 package IO; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 public class InputStreamAndOutputStream { 9 10 public static void main(String[] args) throws IOException{ 11 FileInputStream fin=null; 12 FileOutputStream fout=null; 13 14 try { 15 fin=new FileInputStream("D:/xfmovie/新建文件夹 (2)/MKDaddS117.rmvb"); 16 fout=new FileOutputStream("C:/Users/hp/Desktop/复制测试/t1.rmvb"); 17 18 byte b[]=new byte[1024]; //定义存储数组 19 int readResult; 20 21 long startTime=System.currentTimeMillis(); 22 while((readResult=fin.read(b))!=-1){ 23 fout.write(b, 0, readResult); //边读边写 24 } 25 fout.flush(); 26 27 long endTime=System.currentTimeMillis(); 28 System.out.println("复制成功!!!\n用时:"+(endTime-startTime)+"ms"); 29 } catch (FileNotFoundException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } catch (IOException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 }finally{ 36 if(fin!=null){ 37 fin.close(); 38 } 39 if(fout!=null){ 40 fout.close(); 41 } 42 } 43 } 44 }
BufferedInputStream和BufferedOutputStream
1 package IO; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 10 public class BufferedInputAndOutput { 11 12 public static void main(String[] args) throws IOException{ 13 BufferedInputStream bin=null; 14 BufferedOutputStream bout=null; 15 16 try { 17 bin=new BufferedInputStream(new FileInputStream("D:/xfmovie/新建文件夹 (2)/MKDaddS117.rmvb")); 18 bout=new BufferedOutputStream(new FileOutputStream("C:/Users/hp/Desktop/复制测试/t2.rmvb")); 19 20 byte b[]=new byte[1024]; 21 int readResult; 22 23 long startTime=System.currentTimeMillis(); 24 while((readResult=bin.read(b))!=-1){ 25 bout.write(b, 0, readResult); 26 } 27 28 bout.flush(); 29 long endTime=System.currentTimeMillis(); 30 System.out.println("复制完成!!!\n用时:"+(endTime-startTime)+"ms"); 31 } catch (FileNotFoundException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } catch (IOException e) { 35 // TODO Auto-generated catch block 36 e.printStackTrace(); 37 }finally{ 38 if(bin!=null){ 39 bin.close(); 40 } 41 if(bout!=null){ 42 bout.close(); 43 } 44 } 45 46 } 47 48 }
(1)存储数组大小设置为1024:
第一个:
复制成功!!!
用时:12112ms
第二个:
复制完成!!!
用时:3649ms
结论:可以看到,当存储数组大小远小于8192byte时,使用Buffered缓冲的速度明显快。
(2)存储数组大小设置为1024*1024时:
第一个:
复制成功!!!
用时:3341ms
第二个:
复制完成!!!
用时:3445ms
结论:可以看到,当存储数组接近8192,或大于8192时,两者速度差异不明显。

浙公网安备 33010602011771号