Java I/O基礎框架_08

1、流(Stream)  

stream代表的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。Java的I/O操作類在java.io包下,這些類可以大概分爲兩類,操作字節流的和操作字符流的類:

  1. 字節流  表示以字節爲單位從stream中讀取或往stream中寫入信息,即java.io包中的inputstream類和outputstream類的派生類。通常用來讀取二進制數據,如圖象和聲音。 
  2. 字符流  以Unicode字符爲單位從stream中讀取或往stream中寫入信息。

2、字節輸入流

下面來看一下操作字節輸入流的類的框架結構:


由以上的類圖可以看出:

  1.  InputStream是所有的輸入字節流的父類,它是一個抽象類。
  2. ByteArrayInputStreamStringBufferInputStreamFileInputStream是三種基本的介質流,它們分別從Byte數組、StringBuffer和本地文件中讀取數據。PipedInputStream是從與其它線程共用的管道中讀取數據。
  3. ObjectInputStream和所有FilterInputStream的子類都是裝飾流。

各個類的詳細的介紹如下:



在FilterInputStream類下還有一些具體的子類,如下圖:




3、字節輸出流

操作字節輸出流的類的框架結構:


可以看到:

  1. OutputStream是所有的輸出字節流的父類,它是一個抽象類。
  2. ByteArrayOutputStreamFileOutputStream是兩種基本的介質流,它們分別向Byte數組和本地文件中寫入數據。PipedOutputStream是向與其它線程共用的管道中寫入數據。
  3. ObjectOutputStream和所有FilterOutputStream的子類都是裝飾流。下表列出了輸出字節流的功能及如何使用它們。

來看一下各個類的具體介紹:


在FilterOutputStream類下還有一些具體的子類,如下圖所示。


4、字符輸入流


從上圖可以看出:    

  1. Reader是所有的輸入字符流的父類,它是一個抽象類。
  2. CharReaderStringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
  3. BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
  4. FilterReader是所有自定義具體裝飾流的父類,其子類PushbackReaderReader對象進行裝飾,會增加一個行號。
  5. InputStreamReader是一個連接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream轉變爲Reader的方法。我們可以從這個類中得到一定的技巧。


5、字符輸出流



在上面的關係圖中可以看出:

  1. Writer是所有的輸出字符流的父類,它是一個抽象類。
  2. CharArrayWriterStringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
  3.  BufferedWriter是一個裝飾器爲Writer提供緩衝功能。
  4. PrintWriterPrintStream極其類似,功能和使用也非常相似。
  5. OutputStreamWriterOutputStreamWriter轉換的橋樑,它的子類FileWriter其實就是一個實現此功能的具體類(具體可以研究一下Source Code)。功能和使用和OutputStream極其類似,後面會有它們的對應圖。


6、字節流與字符流的區別

  1. Reader和Writer要解決的,最主要的問題就是國際化。原始的I/O類庫只支持8位的字節流,因此不可能很好地處理16位的Unicode字符流。Unicode是國際化的字符集,這樣加了Reader和Writer之後,所有的字節流都可以轉換爲字符流,也就都支持Unicode了。
  2. 使用字符處理要比字節處理的效率高。實際上字節流在操作時本身不會用到緩衝區(內存),是文件本身直接操作的,而字符流在操作時使用了緩衝區,通過緩衝區再操作文件,如下圖所示。同時緩衝區也增加了操作字符的靈活性,例如可以讀取當前位置的前一個字符等等...

    所以說某些情況下,如果一個程序頻繁地操作一個資源(如文件或數據庫),則性能會很低,此時爲了提升性能,就可以將一部分數據暫時讀入到內存的一塊區域之中,以後直接從此區域中讀取數據即可,因爲讀取內存速度會比較快,這樣可以提升程序的性能。 

    但是,Read和Write並不是取代InputStream和OutputStream,有時,你還必須同時使用"基於byte的類"和"基於字符的類"。爲此,它還提供了兩個"適配器(adapter)"類。InputStreamReader負責將InputStream轉化成Reader,而OutputStreamWriter則將OutputStream轉化成Writer。 


發佈了52 篇原創文章 · 獲贊 47 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章