IO 輸入與輸出(5)-- 過濾流和包裝類

下面是我們需要了解的知識

l  包裝類的概念與作用

l  BufferedInputStreamBufferedOutputStream

l  DataInputStreamDataOutputStream

 

首先我們先看一下過濾流(包裝類)的概念與作用

 

這裏需要澄清一點,這裏所說的包裝類可不是Java中像IntegerChar等這些包裝類,這裏所說的包裝類和過濾流其實是一碼事,過濾流就類似於包裝類的作用。

 

過濾流的主要特點是在輸入與輸出數據的同時能對所傳輸的數據做指定類型或格式的轉換,即可實現對二進制字節數據的理解和編碼轉換。

 

現在讓你通過FileOutputStream對象將一個浮點小數寫入到文件中,你感覺有點困難吧?能否通過FileOutputStream對象直接將一個整數寫入到文件呢?這就需要過流流來進行想的處理了。

 

下面我們首先來看一下過濾流的一種,BufferedInputStreamBufferedOutputStream

 

之前在介紹FileInputStreamFileOutputStream的例子中,使用了一個byte類型的數組來作爲數據讀入的緩衝區,以文件讀取微粒,硬盤存取的速度遠低於內存中的數據存取速度。爲了減少隊硬盤的存取,通常從文件中一次讀入一定長度的數據,而寫入時也是一次寫入一定長度的數據,這樣可以增加文件存取的效率。

 

BufferedInputStreamBufferedOutputStream從字面理解也就是緩衝的意思,確實這兩個類就可以爲InputStreamOutputStream類的對象增加緩衝區的功能。

 

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

 

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

 

需要注意的是BufferedInputStreamBufferedOutputStream並沒有改變InputStreamOutputStream的行爲,讀入或寫出時的動作還是InputStreamOutputStream負責。BufferedInputStreamBufferedOutputStream只是在操作對應的方法之前動態的爲它們加上一些額外的緩衝區的功能。

 

接着我們再來看一下DataInputStreamDataOutputStream

 

DataInputStreamDataOutputStream可提供一些對Java基本數據類型寫入或輸出的方法,就像讀寫intdoubleboolean等的方法。由於Java的數據類型的大小是規定好的,在寫入或輸出這些基本數據類型時,就不用擔心不同平臺間數據大小不同的問題。

 

同樣的,DataInputStreamDataOutputStream類並沒有改變InputStreamOutputStream的行爲,讀入或寫出時的動作還是InputStreamOutputStream負責。DataInputStreamDataOutputStream只是在實現對應的方法時,動態的爲它們加上類型判斷功能。

 

最後我們來編寫一個程序,分別使用DataOutputStream中提供給的writeUTFwriteByteswriteChars方法,比較這幾個方法的差異。程序所使用的流棧如下:

程序àDataoutputStreamàBufferedOutputStreamàFileOutputStreamà文件

 

 DataAndBufferedTest

 

 

大家可以運行該程序,對比生成的文本文件來比較差異性。

版權聲明: 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章