Thinking in Java:第十八章 JAVA I/O 系統

來源:互聯網
上載者:User

       第一次看這一章,沒怎麼看懂,很頭大,網上找到一篇很簡單的總結文檔,比較適合初學者。

      JAVA_IO流學習總結.pdf

      當然,在看這篇文章之前,先看一下如下內容:

      我不知道各位是師弟師妹們學java時是怎樣的,就我的剛學java時的感覺,java.io包是最讓我感到一頭霧水的。所以現在這篇文,儘可能簡單地描述java.io包的結構,希望對java.io同樣一頭霧水的師弟師妹們有些協助^_^
        我開始學java時,java.io的介紹是在《java編程思想》裡看的。說實話,當時完全看不明白——“java.io的是用‘decorator模式’來構建的”——剛學java時,天知道啥玩意叫decorator……
        不過要明白java.io,確實需要理解decorator設計模式,下面詳細介紹下。
        所謂decorator,裝飾,其實可以說是一種設計的技巧,說白了沒什麼難的,別看很多網上資料說的天花亂墜的(非常討厭有些文章總是把簡單的問題描述得跟兩頭豬的kiss問題一樣複雜……)。
decorator的結構如下:

 MyInterface
       |
_______|_______
|             | 
Myclass     Decorator
          ____|_____
          |        | 
  DecoratorA      DecoratorB

decorator的目的是在不改變任何原有的類的基礎下,添加新的功能(你可以理解為書上說的靈活性)。其中Myclass是你要擴充的類,DecoratorA跟DecoratorB封裝了你要擴充的功能,並儲存有一個MyInterface的引用。
考慮以下代碼:

public static void main(Strings[] arg){  myInterface a = new myClass();  a.print();}

myInterface 是myClass的介面,只聲明了一個方法print(),myClass實現了該方法:

public void print(){   System.out.println("hello");}

那麼假如我們要在不改變原來的myClass的基礎上,變成輸出“hello world!”,要怎麼做呢?
當然我們可以考慮直接寫個myClass的子類,helloClass之類,但是要是要求根據環境不同,輸出"hello world!",my hello world","my Hello"之類的組合呢?
用繼承的方式將不得不寫一堆類似的子類來。
decorator,裝飾模式的解決方案是,只實現基本的功能,把附加的功能抽出來放一邊。
例如以下代碼:

class DecoratorA implements Decorator{   MyInterface myObject;   DecoratorA(myInterface myObject){     this.myObject = myObject;    }   public void print(){         myObject.print();         System.out.print("world!");   }}class DecoratorB implements Decorator{    MyInterface myObject;    DecoratorA(myInterface myObject){     this.myObject = myObject;     }    public void print(){         System.out.print("my");         myObject.print();    }}

DecoratorA和DecoratorB的功能分別是列印出world跟my。這時main函數要列印出my hello world可簡單變為:

public static void main(Strings[] arg){  MyInterface a =new DecoratorA(new DecoratorB(new MyClass());  a.print();}

簡單吧?簡單的說,就是:

print(){  print("xxx");//可替換成你要添加的任何處理;  myObject.print();//調用基礎類的函數;  xxxx;        //後續處理}

Decorator的介紹就到此為止,接下來講java.io.
看到

MyInterface a =new DecoratorA(new DecoratorB(new MyClass());

是不是覺得眼熟咧?這跟

BufferedInputStream bis = new BufferedInputStream(new DataInpuStream(new FileInputStream("xxx.txt")));

是不是很像?
(畫外音加一個臭雞蛋扔上來:因為java.io就是用decorator模式組織的,當然像啦……)
java.io分Stream跟reader、writer兩大類,這裡只詳細介紹Stream,並最後兩者間的關係。Stream又分inputStream、OutputStream,兩者基本是對稱的,這裡也只介紹InputStream.

 
             java.io.InputStream
                        |
 _______________________|________________________
 |                                             |
ByteArrayInputStream                      FilterInputStream
StringBufferInputStream   _____________________|____________________________
FileInputStream           |                |                    |          |
PipedInputStream  DataInputStream BufferedInputStream  LineNumInpuStream XXX
(註:xxx是PushbackInputStream,上面的圖放不下)

這個圖跟最初介紹的hello world的圖很像吧?呵呵。
基礎的流只有左邊4個,這些流代表了資料的來源,所有的流都必須從這四個中之一開始。(注,還有一個RandomAccessFile、File,這兩個不在本文介紹範圍)。
然後當我們需要什麼添加功能,就從右邊中選擇一個裝飾。例如,我們需要緩衝功能,那麼需要bufferedInputStream裝飾:

BufferdInputStream is = new BufferedInputStream(new FileInputStream("xxx.txt"));

假如再要DataInputStream的功能,只要在加一層:
DataInputStream dis = new DataInputStream(new BufferdInputStream(new FileInputStream));
(厄,我不甚明白這個類添加的功能是做什麼用的,資料說是增加讀取java原生資料的功能,不甚明白,有清楚的來補充一下,pipeInputStream跟sequenceInputStream也沒用過,歡迎補充說明)
這裡你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法調用,並添加相應的處理。

最後說說InputStream跟reader的區別:

老實說,我只知道一個支援位元組流,一個支援unicode流,除此之外有啥米效能上的不同我還真不知道,哈哈。知道的快來補充補充~

參考資料:

《最好的java
io包解密》


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.