1. 程式人生 > >關於BufferedInputStream和BufferedOutputStream的實現原理的理解

關於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.,它們的作用目的一致:

                        它們都是為了提高效能