[N天一練]java io package

          從學習java以來,一直感覺jdk中的IO包是一個亂七八糟的包,裏面堆積着無數的input、output,眼花繚亂。而使用的時候也經常是“圓環套圓環”式的,曾經憤憤地想這坑爹的設計讓我們自己去記憶?最近閒來無事突然想了解爲什麼在打開一個io時一定要在finnally裏將其關閉時,纔想到應該好好梳理這部分的內容。

        細瞭解之後發現java io包中的類體系其實還是比較好理解,只要明白了兩種設計模式即可:適配器模式和裝飾器模式。

       適配器的類圖如下(左邊的是類適配器模式、右邊的是對象適配器模式):

        

        適配器顧名思義就是要將adaptee類適配成具備target接口行爲的adapter。類適配器和對象適配器的不同在於adapter到底是繼承還是聚合adaptee類。

         而裝飾器模式與適配器,尤其是對象適配器的不同在於,它沒有target接口約束,純粹是爲了需要去擴展被裝飾對象,使其滿足某些功能,其類圖如下:

        

       其實在具體應用中不會有這麼複雜的關係,最常見的應該是decorator直接依賴decoratee,然後擴展其功能。而且用了繼承體系反而減弱了裝飾器的模式的優點,因爲在java中聚合往往要優先於繼承。

        說完這兩個設計模式後,我們來梳理一下java io包中的類吧。其實java io包中核心的類是inputstream和outputstream類,面向字節流的讀取。爲了更好地支持IO讀取,後在字節流基礎上加入了字符流的讀寫體系:reader\writer,因此這兩個體系的接口包括其下的子類功能往往是一一對應的。而這兩大體系之間可以通過InputStreadReader\OutputStreamWriter來進行轉化。而這裏的轉化採用的正是適配器模式,將inputstream\outputstream接口適配成支持字符讀取的行爲。

        而在這兩大讀寫體系中,所有的類又可以分爲兩類(以inputstream\outputstream): 一類是通過適配器模式來架構的,主要爲了將inputstream\outputstream讀寫接口適配成符合各種不同的數據介質,比如文件、byteArray,字符串等;另一類是通過裝飾器模式來架構的,主要爲了解決讀取到數據後要進行一些額外的處理,比如BufferedInputStream類就是加入了緩衝區功能,這一類的類都是繼承自FilterInputStream\FilterOutputStream類。其實第二類你要稱爲對象適配器模式也無可厚非。

        所以所謂眼花繚亂的“圓環套圓環”式的調用方式,其實就是在做這些適配和裝飾,使其滿足特定的功能。因此假設我們要從一個文件中讀取數據,首先肯定是要將利用適配器模式下的類,來獲取一個支持文件讀取的inputstream,如FileInputStream,代碼如下:

InputStream in = new FileInputStream(new File("filename"));

        然後就要加一些功能,比如說按字符流來讀取吧

Reader reader = new InputStreamReader(in);
        或者再加上一個緩衝區的功能

BufferedReader bReader = new BufferedReader(reader);
        然後我們就可以一行一行的讀數據了

String msg= null;
while((msg=bReader.readLine())!=null){
    System.out.println(msg);
}
       以上就是最近看java io 包的一些小心得!


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