1. 程式人生 > >IO流家族層級結構圖介紹(Java)

IO流家族層級結構圖介紹(Java)

        在上一篇的IO流引入中,我們拿讀寫簡單文字檔案為例,說明了IO流在我們開發中最常用的一個場景,那麼我們今天就來看看IO流究竟是什麼,究竟能幫助我們幹什麼以及它的主要組成部分。

 

1,IO流是什麼

        說白了,IO流就是java 平臺類庫提供給我們的用於處理資料的API,在java API中,我們從其中讀入一個位元組序列的物件為輸入流(InputStream),反之,向其中寫入一個位元組序列的物件為輸出流(OutputStream)。所以本質上來說,Java 中所有類似物件對應的類共同組成了我們所說的IO流。

 

2,IO流能幹什麼

        在說其功能之前,我們簡單的看一下下面這張圖:

很簡單,但這就是IO流功能的概括,用於在不同的儲存位置間傳遞資料,至於傳遞什麼型別的資料,如何高效的傳遞資料以及如何保證傳遞資料的安全性等等,就延伸除了不同的IO流。這些不同種類的IO流就形成了我們Java當中的IO家族。

 

3,IO流家族的組成

其實瞭解IO流小夥伴都知道,IO流的分類有很多種方式,比如按傳輸的資料基本單位型別分,按流的方向分等;那我們這裡就顧名思義一下,先按最簡單最直觀的方式分一下,I(In)O(Out)流也就是輸入輸出流,其實也就是我們常說的:

  • InputStream (Reader):輸入流
  • OutputStream(Writer):輸出流

除了這種,還有就是按傳輸的資料單位來分:

  • Reader,Writer:字元流
  • InputStream,OutputStream:位元組流

說到這裡,我們在上一篇用的主要API基本上都出來了,那麼下面就來看看Java中關於IO這一塊的API究竟有多少,我們先看位元組流相關API組成以及層級結構:

哇,看著有一點多,但是沒有關係,我們先簡單對上圖進行簡要的說明,在後續我們會對其中的主要API進行逐一詳細的介紹的;關於上圖有以下幾點說明:

  • 上圖源於《Java 核心技術》卷2
  • 其中矩形表示Class,八邊形表示Interface
  • 其中綠顏色矩形表示使用相對較多的API(後續可能會變,因為我也是在學習的過程中,只是結合自己的使用頻率來的)
  • 實現介面本應該使用虛線,我這裡使用和繼承一樣的實線,不好意思

目前,關於本圖的解釋就到這裡了,至於InputStream和OutputStream是位元組輸入輸出流的基類以及FilterInputStream和其子類實際上是採用了裝飾者設計模式的關係等等這樣的說明,在本篇不展開,後續會逐一介紹。上面就是IO流家族中的位元組流家族,雖然可以把IO流家族分為位元組流和字元流兩種,但是這部分在IO流家族中佔比是肯定不止一半的。Ok,說完了位元組流,下面就來看看字元流的家族組成:

其實我不說你也能明白,為什麼字元流佔不到半壁江山了,但是不得不說,我們在平時的讀寫檔案中,基本上使用的都是字元流,因為我們編碼讀寫的通常都是文字檔案,而針對不同的編碼使用位元組流讀取這些文字檔案可能會有問題,而且字元流讀寫本身在效能上就有優勢,所以,這部分看似類容不多,但是在我們的開發中使用的頻率還是蠻高的,這裡也是同樣,關於上圖給出如下幾點說明:

  • 上圖源於《Java 核心技術》卷2
  • 矩形表示Class,其中綠顏色矩形表示使用相對較多的API(後續可能會變,因為我也是在學習的過程中,只是結合自己的使用頻率來的)
  • 位元組流不便於處理以Unicode形式儲存的資訊的理解

其實到這裡,IO流家族成員就列舉完了,但是有一點需要注意,那就是下面的幾個介面:

 

後續我們會說到,關於流使用完之後要釋放資源的問題,通常我們都是通過呼叫close()方法,所以這裡可以看出,位元組流和字元流的基類都是實現了Closeable介面的;Appendable介面就不用多說了,我們在使用StringBuilder的時候就經常使用Appendable中的方法append(),關於該介面的詳細類容在後續會有介紹。

好的,今天關於IO流家族的組成部分就介紹到這裡了,你可能覺得平時我們就使用那麼幾個API開發就夠了,用得著這麼多嗎,但是請你相信,IO流家族這麼龐大並不是大部分API沒有用,只是我們沒有嘗試去用,或者說我們所做的東西的要求不需要考慮那麼多,但是請相信,知道不用和不知道怎麼用還是不一樣的。就好比是在電影《錢學森》中,陳坤飾演的錢學森在被問道為什麼要搞原子彈時說的:“手中沒劍和手中有劍不用那是不一樣的”一樣。扯遠了,今天就到這裡了。