標籤:java-io 裝飾者模式
背景
Java的核心庫java.io提供了全面的IO介面。包括:檔案讀寫、標準裝置輸出等。Java中IO是以流為基礎進行輸入輸出的,所有資料被序列化寫入輸出資料流,或者從輸入資料流讀入。 —— 百度百科
Java.io中有很多類,我們如何清楚地知道什麼時候該用什麼類呢?
目標
本文的目標是梳理java.io中各個類的關係,瞭解各個類的應用情境。
概念
資料來源,資料流,目的地。在看關於java io的相關代碼時,每次都要問問自己此時這三者各指的是誰。而本文主要是說資料流的。
歸類
按不同分類方法,將各種“流”歸入不同的類。。
雖然從不同的角度可以將各種各樣的“流”分開,但是它們並不是各自獨立的,會有交叉,就像FileInputStream是輸入資料流,同時也是位元組流或是節點流。
區分輸入資料流和輸出資料流,看類的名稱中有In,還是Out;或是有R還是W。區分位元組流和字元流,基本上看結尾是Stream還是Reader、Writer。那如何區分節點流和處理流,這裡就要說說設計模式中的裝飾者模式了。
剛才說了三種分類有交叉,位元組流中既有節點流,又有處理流。字元流也是一樣。這裡咱們就以位元組流為例,來用裝飾者模式說明節點流和處理流的關係。
學習這部分內容時,我們把資料流比作一個管子,如果說節點流是直接連接在資料來源或目的地上的管子,那麼處理流就是套在管子上的管子,如所示。
裝飾者模式與Java IO
裝飾者模式就是動態地將責任附加到對象上,擴充項物件的行為。我們可以根據需要在節點流上,用處理流進行一層層的裝飾。這樣很靈活,通過組合的方式避免了“類爆炸”。但是,各種各樣的“流”類,也造成了我們使用API的困難。不過明白了裝飾者模式,你就可以根據需要任意封裝了,也就不亂了。
常用類用途
| 節點流 |
用途 |
| FileInputStream |
從檔案讀資料 |
| ByteArrayInputStream |
從記憶體中的位元組數組讀資料 |
| 處理流 |
用途 |
新增行為/備忘 |
| BufferedInputStream |
帶緩衝區的處理流,避免每讀一個位元組都要訪問一次硬碟,提高訪問速率,減小對硬碟的傷害 |
如:readline() |
| DataInputStream |
將位元組直接轉換成各種基本類型(int,double……)進行讀取 |
如:readdouble() |
| ObjectInputStream |
將位元組直接轉化成對象進行讀取 |
serializable,transient,externalizable |
| InputStreamReader |
將位元組轉換成字元進行讀取,對於漢字如果按位元組讀取,讀出來後不知道是什麼字 |
—— |
總結
文章並沒有列舉出java io中所有的輸入輸出資料流,重要的是根據上述的歸納總結能夠舉一反三,融會貫通。具體細節,還要查API文檔。
Java I/O— 梳理各種“流”