java io

1
大多數的文檔中都對io做了很多很多的總結,不過我在學習以後,感覺有些地方在實際編程中基本不會用到,而你只需要知道它大概是個什麼東西,等到哪天真的需要用的時候再去詳細查看這方面的資料。下面是我認爲io中一些比較基本重要的東西。

2
JDK提供的流繼承了四大類:

InputStream(字節輸入流),OutputStream(字節輸出流),Reader(字符輸入流),Writer(字符輸出流)。

按流向分類:

輸入流: 程序可以從中讀取數據的流。
輸出流: 程序能向其中寫入數據的流。
這裏寫圖片描述

按數據傳輸單位分類:

字節流:以字節(8位二進制)爲單位進行處理。主要用於讀寫諸如圖像或聲音的二進制數據。
字符流:以字符(16位二進制)爲單位進行處理。
都是通過字節流的方式實現的。字符流是對字節流進行了封裝,方便操作。在最底層,所有的輸入輸出都是字節形式的。
後綴是Stream是字節流,而後綴是Reader,Writer是字符流。

按功能分類:

節點流:從特定的地方讀寫的流類,如磁盤或者一塊內存區域。
過濾流:使用節點流作爲輸入或輸出。過濾流是使用一個已經存在的輸入流或者輸出流連接創建的。
還有一些比較重要的
DataInputStream,將各種基本數據類型以及string對象格式化輸入到流中(比如readFloat()),
BufferedInputStream,使用它可以防止每次讀取都得進行實際寫操作,代表使用緩存區。
RandomAccessFile隨機讀寫文件,適用於大小已知的文檔記錄。

3
Java I/O庫具有兩個對稱性,它們分別是:

 1 輸入-輸出對稱性,比如InputStream和OutputStream各自佔據Byte流的輸入與輸出的兩個平行的等級結構的根部。而Reader和Writer各自佔據Char流的輸入與輸出的兩個平行的等級結構的根部。

 2 byte-char對稱,InputStream和Reader的子類分別負責Byte和Char流的輸入;OutputStream和Writer的子類分別負責Byte和Char流的輸出,它們分別形成平行的等級結構。

個人認爲下面的一部分內容是IO中最重要的東西
Java的I/O庫總體設計是符合裝飾者模式(Decorator)跟適配器模式(Adapter)的。如前所述,這個庫中處理流的類叫做流類。引子裏所談到的FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流處理器的例子。

 1 裝飾者模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器可以對另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。裝飾者模式是Java I/O庫的整體設計模式。這樣的一個原則是符合裝飾者模式的,如下圖所示:
2 適配器模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器是對其它類型的流源的適配。這就是適配器模式的應用,如下圖所示。

爲什麼不用繼承而用裝飾模式

 我們知道Java I/O庫需要很多性能的各種組合,如果說這些性能的組合是通過繼承方式來實現的話,那麼每一種組合都需要一個類,這樣就會出現大量重複性問題的出現,從而使類數目“爆炸”。而如果採用裝飾模式,那麼不僅類的數目大減少了,性能的重複也可以減至到最少。
這裏寫圖片描述
原始流處理器

  原始流處理器接收一個Byte數組對象,String對象,FileDiscriptor對象或者不同類型的流源對象,根據上面的圖,原始流處理器包括以下四種:

  ByteArrayInputStream:爲多線程的通信提供緩衝區操作功能,接收一個Byte數組作爲流的源。

  FileInputStream:建立一個與文件有關的輸入流。接收一個File對象作爲流的源。

  PipedInputStream:可以與PipedOutputStream配合使用,用於讀入一個數據管道的數據,接收一個PipedOutputStream作爲源。

  StringBufferInputStream:將一個字符串緩衝區轉換爲一個輸入流。接收一個String對象作爲流的源。(JDK幫助文檔上說明:已過時。此類未能正確地將字符轉換爲字節。從JDK1.1開始,從字符串創建流的首選方法是通過StringReader類進行創建。只有字符串中每個字符的低八位可以由此類使用。)

  鏈接流處理器

  所謂鏈接流處理器,就是可以接收另一個流對象作爲源,並對之進行功能擴展的類。InputStream類型的鏈接處理器包括以下幾種,它們都接收另一個InputStream對象作爲流源。

  (1)FilterInputStream稱爲過濾輸入流,它將另一個輸入流作爲流源。這個類的子類包括以下幾種:

  BufferedInputStream:用來從硬盤將數據讀入到一個內存緩衝區中,並從緩衝區提供數據。

  DataInputStream:提供基於多字節的讀取方法,可以讀取原始類型的數據。

  LineNumberInputStream:提供帶有行計數功能的過濾輸入流。

  PushbackInputStream:提供特殊的功能,可以將已經讀取的字節“推回”到輸入流中。

  (2)ObjectInputStream可以將使用ObjectInputStream串行化的原始數據類型和對象重新並行化。

  (3)SeqcueneInputStream可以將兩個已有的輸入流連接起來,形成一個輸入流,從而將多個輸入流排列構成一個輸入流序列。
  這裏寫圖片描述
  上面這個圖向我們傳達了這個信息:鏈接流鏈接流對象接收一個原始流對象或者另外一個鏈接流對象作爲流源;另一方面他們對流源的內部工作方法做了相應的改變,這種改變是裝飾模式所要達到的目的。比如:

  BufferedInputStream“裝飾”了InputStream的內部工作方式,使得流的讀入操作使用了緩衝機制。在使用了緩衝機制後,不會對每一次的流讀入操作都產生一個物理的讀盤動作,從而提高了程序的效率,在汲及到物理流的讀入時,都應當使用這個裝飾流類。
  
 適配器模式是Java I/O庫中第二個最爲重要的設計模式。
 適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口。Adapter 模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
FileInputStream是一個適配器類
在FileInputStream繼承了InputStream類型,同時持有一個對FileDiscriptor的引用。這是將一個FileDiscriptor對象適配成InputStream類型的對象形式的適配器模式,如下圖所示:
這裏寫圖片描述

這裏的理解就是用戶提供的一般是一個File,可以用FileDiscriptor表示,但是IO只接收InputStream類型的接口。而有了這個FileInputStream適配器類,就能達到目的

從byte流到char流的適配
在Java I/O庫中,使用比較頻繁的要數InputStreamReader,OutputStreamWriter這兩種類了,
InputStreamReader是從byte輸入流到char輸入流的一個適配器。下圖所示就是 InputStreamReader與Reader和InputStream等類的結構圖:
這裏寫圖片描述
當把InputStreamReader與任何InputStream的具體子類鏈接的時候,可以從InputStream的輸出讀入byte類型的數據,將之轉換成爲char類型的數據。

感謝下面這位博主
http://dev.csdn.net/author/lin_bei/8b332118ef1241d3a35ece6a2dcb05f6.html
提供了很好的講解。

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