Java IO

一、OIO

1、一些細節

1)傳統的IO是面向,流,的

2)流在底層輸入與輸出都是傳輸的字節,字符流只是上層的封裝

3)OIO中流要麼是輸入流,要麼是輸出流,不可能即是輸入流又是輸出流

2、流的分類

分類方式1:輸入流、輸出流

輸入、輸出是相對於應用程序來說的,應用程序向外傳遞數據爲輸出,外部嚮應用程序傳遞數據爲輸入

分類方式2:節點流、過濾流

節點流:從特定的地方讀寫的流,例如:磁盤或一塊內存區域

過濾流:使用節點流作爲輸入或輸出,過濾流是使用一個已經存在的輸入流或輸出流連接創建的,過濾流一定是依賴一個節點流的

3、java.io包中InputStream/OutputStream的類層次

其中藍色爲節點流、紫色爲過濾流

 

4、java.io包中Reader/Writer的類層次

5、OIO流的創建包裝過程體現的設計模式:裝飾器模式

裝飾模式說明

裝飾器模式擴展的是:對象功能、動態的

繼承             擴展的是:類的功能、靜態的

  • 裝飾模式以對客戶(使用這個對象的一方)透明的方式動態的給一個對象附加上更多的功能,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。
  • 裝飾模式可以在不創建更多子類的情況下,將對象的功能加以擴展。
  • 裝飾模式把客戶端的調用,委派到被裝飾類。裝飾模式的關鍵在於這種擴展完全是透明的。
  • 裝飾模式是在不必改變原類文件和使用繼承的情況下,動態擴展一個對象的功能。他是通過創建一個包裝對象,也就是裝飾來包裹真實的對象

裝飾模式的角色

1、抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。

  • OIO中對應InputStream

2、具體構件角色(Concrete Component):定義一個將要接收附加責任的類

  • OIO中對應FileInputStream

3、裝飾角色(Decorator):持有一個構件對象的引用,並定義一個與抽象構件接口一致的接口

  • OIO中對應FilterInputStream

4、具體裝飾角色(Concrete Decorator):負責給構件對象貼上附加的責任(功能)。

  • OIO中對應BufferedInputStream

裝飾模式的特點

  • 裝飾對象和真實對象有相同的接口。這樣客戶端對象就可以以和真實對象相同的方式調用裝飾對象。
  • 裝飾對象包含了一個真實對象的引用
  • 裝飾對象接收所有來自客戶端請求,把請求轉發給真實對象
  • 裝飾對象可以在轉發前 或者 後,增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構,就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。

舉例:

其他角色略。

具體裝飾角色:

客戶端調用:

裝飾模式與繼承比較

裝飾模式 繼承
  • 用來擴展特點對象的功能
  • 不需要子類
  • 動態
  • 允許時增加功能
  • 防止由於子類而導致的複雜和混亂
  • 更多的靈活性
  • 對於一個給定的對象,同時可能有不同的裝飾對象,客戶端可以通過他的需要選擇合適的裝飾對象
  • 用來擴展類的功能
  • 需要子類
  • 靜態
  • 編譯時增加功能
  • 導致很多子類產生
  • 缺乏靈活性

裝飾模式的適用場景

  • 想要透明並且動態的給對象增加新的功能而又不會影響其他對象
  • 給對象增加的功能,在未來可能會發生改變
  • 用子類(繼承)擴展功能不實際的情況下

Jdk IO庫使用裝飾器模式帶來的好處

  • 即滿足IO體系對輸入輸出流增加功能的要求
  • 在運行期動態增加功能,避免繼承方式會造成的類的數量龐大

二、NIO

 

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