(更多內容請關注本人微信訂閱號: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