關於BufferedInputStream和BufferedOutputStream的實現原理的理解


  在介紹FileInputStream和FileOutputStream的例子中,使用了一個byte數組來作為數據讀入的緩沖區,以文件存取為例,硬盤存取的速度遠低於內存中的數據存取速度。為了減少對硬盤的存取,通常從文件中一次讀入一定長度的數據,而寫入時也是一次寫入一定長度的數據,這可以增加文件存取的效率。

java.io.BufferedInputStream與java.io.BufferedOutputStream可以為InputStream、OutputStream類的對象增加緩沖區功能。

構建BufferedInputStream實例時,需要給定一個InputStream類型的實例,實現BufferedInputStream時,實際上最后是實現InputStream實例。

同樣地,在構建BufferedOutputStream時,也需要給定一個OutputStream實例,實現BufferedOutputStream時,實際上最后是實現OutputStream實例。

BufferedInputStream的數據成員buf是一個位數組,默認為2048字節。當讀取數據來源時,例如文件,BufferedInputStream會盡量將buf填滿。當使用read()方法時,實際上是先讀取buf中的數據,而不是直接對數據來源作讀取。當buf中的數據不足時,BufferedInputStream才會再實現給定的InputStream對象的read()方法,從指定的裝置中提取數據。

        BufferedOutputStream的數據成員buf是一個位數組,默認為512字節。當使用write()方法寫入數據時,實際上會先將數據寫至buf中,當buf已滿時才會實現給定的OutputStream對象的write()方法,將buf數據寫至目的地,而不是每次都對目的地作寫入的動作。

--------------調用BufferedInputStream、BufferedOutputStream 例子 ------------------

 1 public static void main(String[] args) {    
 2         try {
 3             BufferedInputStream bis=new BufferedInputStream(new FileInputStream("f:/a.mp3"));
 4             BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("f:/b.mp3"));
 5             byte[] b=new byte[1024];  //①..??為什么還要用到數組
 6             int len=0;
 7             while(-1!=(len=bis.read(b))){
 8                 bos.write(b,0,len);
 9             }
10             
11         } catch (FileNotFoundException e) {
12             System.out.println("文件找不到");
13             e.printStackTrace();
14         } catch (IOException e) {
15             e.printStackTrace();
16         }finally{
17             if(null!=bos){
18                 bos.close();
19             }
20             if(null!=bis){
21                 bis.close();
22             }
23         }
24 }
①。在這里,自己有個疑問:既然BufferedInputStream已經實現了緩沖,那為什么在程序中還要寫那個byte[]數組提高性能?
個人理解:(有待商榷)
    1.,它們的產生不一樣:
                        其中,BufferedInputStream中的緩沖數組,跟自己定義的緩沖數組不一樣。
                        BufferedInputStream中的緩沖數組是程序一開始就已經定義好的,節省了程序創建一個數組的時間。
                        而上面代碼中的byte[] b數組(相當於緩沖數組),是程序運行的時候才開始創建的,花費了一些時間
   2.,它們的作用對象不一樣:
                        BufferedInputStream的緩沖數組是面對程序對硬盤數據的,而自己在程序定義的數組byte[] b是對已經從硬盤讀取到內存的數據,
                        也就是說,byte[] b是讀取內存中的buf數組的數據。
   3.,它們的作用目的一致:
                        它們都是為了提高性能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM