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时,两者速度差异不明显。

  

 

posted @ 2021-01-26 20:46  L1998  阅读(287)  评论(0)    收藏  举报