關於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.,它們的作用目的一致:
它們都是為了提高效能