(更多內容請關註本人微信訂閱號:it_pupil) 你沒進錯,我們講的是Java的輸入輸出流。 概述 ➤ 可以從其中讀入一個位元組序列的對象稱作輸入流。(輸入流是一個對象,可以從這個對象中讀取一個位元組序列。) ➤ 可以向其中寫入一個位元組序列的對象稱作輸出流。 ➤ 讀入或者寫入的位元組序列當然有個來源地和 ...
(更多內容請關註本人微信訂閱號:it_pupil)
你沒進錯,我們講的是Java的輸入輸出流。
概述
➤ 可以從其中讀入一個位元組序列的對象稱作輸入流。(輸入流是一個對象,可以從這個對象中讀取一個位元組序列。)
➤ 可以向其中寫入一個位元組序列的對象稱作輸出流。
➤ 讀入或者寫入的位元組序列當然有個來源地和目的地(輸入流從哪裡讀取位元組序列的,輸入流把位元組序列寫入到哪裡去?),這個來源地和目的地可以是文件(通常)、網路鏈接,記憶體塊等。
➤ 抽象類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