程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> "流"派家族,一脈相承,派家族一脈相承

"流"派家族,一脈相承,派家族一脈相承

編輯:JAVA綜合教程

"流"派家族,一脈相承,派家族一脈相承


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved