FileInputStream是实际对应物理文件的源

BufferedInputStream是对以上源的包装



BufferedInputStream 有个内部缓冲区当read时会先把缓冲区填满,然后下次读取是直接从缓冲区读取。当读取的位置大于缓冲区时会再一次加载缓冲区。

 

read()read(byte[] buf, int off, int len)处理方式一样,区别在于后者一次返回多个数据,但是同样都是先放入缓冲区,然后再读取。


  

至于性能问题,我们都知道文件的物理读取性能肯定要大于内存读取,FileInputStream.read()相当于一次物理读取,而BufferedInputStream .read()大部分相当于一次内存读取。

 

 

 

同理FileOutputStream和BufferedOutputStream原理也是一样,也是有个缓冲区,每次write相当于写入缓冲区,当缓冲区慢了后在物理写入文件。


 

测试

 

public static void bufferTest() throws IOException{

       BufferedInputStream is = new BufferedInputStream(new FileInputStream("d:/A.exe"));

       BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("d:/B.exe"));

       byte[] buffer = new byte[100];

      

       System.out.println("buffer start "+new Date());

       int size = 0 ;

       while((size=is.read(buffer, 0, buffer.length))!=-1){

           out.write(buffer);

       }

       is.close();

       out.close();

       System.out.println("buffer end "+new Date());

    }

   

    public static void ioTest()throws IOException{

       FileInputStream is = new FileInputStream("d:/A.exe");

       FileOutputStream out = new FileOutputStream("d:/C.exe");

       byte[] buffer = new byte[100];

      

       System.out.println("io start "+new Date());

       int size = 0 ;

       while((size=is.read(buffer, 0, buffer.length))!=-1){

           out.write(buffer);

       }

       is.close();

       out.close();

       System.out.println("io end "+new Date());

    }

 

当物理读和缓冲读的数据块大小相同时,两者的速度应该是相差无几。

转载自: http://benx.iteye.com/blog/1107739