"流"派家族,一脈相承,派家族一脈相承
(更多內容請關注本人訂閱號:it_pupil)
概述
➤ 可以從其中讀入一個位元組序列的對象稱作輸入資料流。(輸入資料流是一個對象,可以從這個對象中讀取一個位元組序列。)
➤ 可以向其中寫入一個位元組序列的對象稱作輸出資料流。
➤ 讀入或者寫入的位元組序列當然有個來源地和目的地(輸入資料流從哪裡讀取位元組序列的,輸入資料流把位元組序列寫入到哪裡去?),這個來源地和目的地可以是檔案(通常)、網路連結,記憶體塊等。
➤ 抽象類別InputStream和OutputStream是輸入輸出資料流階層的基礎(祖宗)。
➤ 從上面看出,輸入輸出資料流以位元組為單位,那麼,它們就不方便處理以Unicode形式儲存的資訊(用兩個位元組來編碼一個字元。),所以,從抽象類別Reader和Writer中又繼承出來一個層次架構,專門處理這種Unicode字元。這些類的讀入與寫出是基於兩位元組碼元的,而不是單位元組字元。
讀寫位元組
➤ InputStream只有一個抽象的讀方法:abstract int read();
➤ 設計具體的輸入資料流,必須覆蓋read()方法。比如:FileInputStream覆蓋read()增加了功能:從檔案中讀位元組。
➤ InputStream還有若干個非抽象的方法,比如,讀入一個位元組數組啊,跳過大量的位元組再開始讀入啊等,而這些方法都調用了抽象的read()方法,所以,各個子類只需要覆蓋read()方法。
➤ 與InputSDtream類似,OutputStream定義了抽象寫方法:abstract void write(int b);
➤ 完成讀寫後,要調用close方法關閉流,釋放資源。
➤ read和write方法操作時都將被阻塞(安全執行緒),直至位元組確實被讀入或者寫出,可以用available方法事先檢查可讀入的位元組數量。
➤ close在關閉流的同時,還會把輸出緩衝區的字元全部全部強制推出去。如果不關閉,那麼緩衝區的最後留下的資料可能永遠不會傳送出去了。
➤ 可以用flush()方法強制把緩衝區的資料沖刷出去。
完整的流家族
➤ 讀寫單個位元組或位元組數組:InputStream和OutputStream。
➤ 讀寫字串和數字:擴充InputStream和OutputStream,產生豐富的子類,如:
DataInputStream和DataOutputStream:以二進位格式讀寫所有的Java基本類型。
ZipInputStream,ZipOutputStream:讀寫Zip檔案。
➤ 上面不論是祖宗還是子孫,均以位元組或者位元組數組為讀取目標。讀取Unicode文本呢(以雙位元組為碼元):使用Reader和Writer的子類。
組合流過濾器
➤ FileInputStream可以按位元組讀取檔案中的資料,但是沒法讀取數實值型別。
➤ DataInputStream可以讀入數實值型別(readDouble()等),但是它不能從檔案中讀取資料啊。
➤ 那麼我現在想從檔案中讀入數字,怎麼破?那就套一層:
➤ 我不但要從檔案中讀入數字,我還要在讀取過程中利用緩衝區快取資料,怎麼破?那就繼續套:
➤ 上面的一層套一層的方式,其實是Java經典的設計模式:裝飾者模式的應用:
原文連結:
http://mp.weixin.qq.com/s?__biz=MzIyNzUzNjQ3MA==&mid=2247483849&idx=1&sn=656bf330b2851fa301efcff257a1222f&scene=21#wechat_redirect