1. 程式人生 > >Java I/O 知識點(一)

Java I/O 知識點(一)

1、“流”遮蔽了實際I/O裝置中處理資料的細節;Java類庫中的I/O類分成了輸入和輸出兩部分。任何自inputStream或Reader派生的而來的類都含有名為read()的基本方法,用於讀取位元組或位元組陣列。同樣,任何來自outputStream或者Writer派生而來的類都含有名為write()的基本方法,用於寫單個位元組或者位元組陣列。但是,我們經常不會用到這些方法,它們之所以存在是因為別的類會使用它們,以便提供更加有用的介面。因此,我們很少使用單一的類來建立流物件,而是通過疊加多個物件來提供所期望的功能(這就是裝飾者模式)。實際上,Java中“流”類庫讓人迷惑的主要原因是:建立單一的結果流,卻需要建立多個物件。

2、Java I/O類庫分類:輸入有關的類均繼承自InputStream,輸出有關的類均繼承OutputStream。

輸入資料來源:

---->位元組陣列、String物件、檔案、“管道”、一個由其他種類的流組成的序列,以便我們可以將它們收集合併到一個流內、其他資料來源(如網路);

每一種資料來源都有與之對應的InputStream子類,另外,FilterInputStream也是InputStream的子類,為“裝飾器”類提供基類,其中“裝飾器”類可以把屬性或者有用的介面與輸入流連線到一起。

《ByteArrayInputStream 允許將記憶體的緩衝區當做InputStream 》、《StringBufferInputStream 將String作為InputStream》、《FileInputStream 用於從檔案中讀取資訊》、《PipedInputStream 產生用於寫入相關PipedOutputStream的資料。實現“管道化”概念》、《SequenceInputStream 將兩個或者多個InputStream物件轉換成單一的InputStream》、《FilterInputStream 抽象類,作為“裝飾器”的介面。其中,“裝飾器”為其他的InputStream類提供了有用的功能》

輸出:位元組陣列、檔案或者管道。另外,FilterOutputStream也是OutputStream的子類,為“裝飾器”類提供基類,其中“裝飾器”類可以把屬性或者有用的介面與輸出流連線到一起。

---->ByteArrayOutputStream 、FileOutputStream 、PipedOutputStream、FilterOutputStream

3、Java I/O類庫需要多種不同功能的組合,這正是使用裝飾器模式的原因。這也是Java I/O類庫存在filter類的原因。抽象類filter是所有裝飾器類的基類。裝飾器必須具有和它所裝飾的物件的相同的介面,但它可以擴充套件介面,而這種情況只發生在個別filter類中。FilterInputStream 、FilterOutputStream是用來提供裝飾器類的介面以控制特定輸入流和輸出流的兩個類,這兩個類是裝飾器的必要條件。

FilterInputStream 的型別:

FilterInputStream能夠完成兩件完全不同的事情。其中,DataInputStream允許我們讀取不同的基本資料型別及String物件,其他的FilterInputStream類則在內部修改InputStream的行為方式:是否緩衝、是否保留它所讀過的行等等。最後兩個類看起來更像是建立編譯器,因此一般使用的較少。

《DataInputStream 與DataOutputStream搭配使用,我們可以按照可移植的方式從流讀取基本資料型別(int、char等)》

《BufferInputStream 防止每次讀取時都得進行實際寫操作。代表“使用緩衝區”》

《LineNumberInputStream 跟蹤輸入流中的行號》

《pushbackInputStream 具有“能彈出一個位元組的緩衝區”。因此可以將讀取的最後一個字元回退》

FilterOutputStream的型別:

《DataOutputStream 與DataInputStream配合,按照可移植(DataOutputStream 將資料格式化輸出到“流”中,這樣任何機器上的DataInputStream都能夠讀取它。即如果我們使用DataoutputStream寫入資料,Java保證我們可以使用DataInputStream準確的讀入資料---無論平臺多麼的不同)的方式向流中寫入基本型別、String物件的資料》

《PrintStream 產生格式化的輸出,DataOutputStream處理儲存,PrintStream 處理顯示 》

《BufferOutputStream 避免每次傳送資料時都要進行實際的寫操作。代表“使用緩衝區”。可以呼叫flush清空緩衝區》

4、面向字元及相容Unicode的Java I/O  ----  Reader和Writer。

InputStream和OutputStream是面向位元組的形式的I/O,而Java1.1對基本的I/O流做出了重大的修改,Reader和Writer是面向字元及相容Unicode的Java I/O 。但是需要說明的是InputStream和OutputStream仍然可以提供極有價值的功能,是不可取代的。而且有的時候,我們必須把來自於“位元組”層次結構中的類和“字元”層次結構中的類結合使用起來。為了實現這個目的,要用到“介面卡”類:InputStreamReader可以把InputStream轉換成Reader,而OutputStreamWriter可以把OutputStream轉換成Writer。

設計Reader和Writer繼承層次結構主要是為了國際化。老的I/O流繼承層次結構僅支援8位位元組流,不能很好的處理16位的Unicode字元。另外,新類庫的設計使得它的操作比之前的舊類庫更快。

使用準則:儘量嘗試使用Reader和Writer,一旦程式程式碼無法成功編譯,我們就會發現自己不得不使用面向位元組的類庫,比如Zip


5、更改流的行為

對於InputStream和OutPutStream來說,我們會使用FilterInputStream和FilterOutputStream的裝飾器子類來修改“流”以滿足特殊需要。Reader和Writer的類的繼承結構層次沿用相同的思想--但並不完全相同。注意:FilterWriter是抽象類,沒有任何的子類。


這裡介紹一下PrintWriter,它是檔案輸出的快捷方式,Printriter使得你不必在每次希望建立檔案的時候都去執行所有的裝飾工作。遺憾的是,其他的常見的寫入任務並沒有快捷方式。

PrintWriter out = new PrintWriter(file);

6、自我獨立的類:RandomAccessFile

RandomAccessFile派生自Object,與上述兩個繼承層次結構的I/O類庫沒有任何關係。支援搜尋方法,並且只適用於檔案,不支援裝飾。在JDK1.4中。RandomAccessFile的大多數功能都被nio儲存對映檔案所取代了。