在介紹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 }