java 的IO類庫的基本架構
阿新 • • 發佈:2019-04-01
過程 exceptio 程序 decode 我們 網絡傳輸 使用 類庫 成了
兩個要點:
java IO 操作的類在java.io 包中,大概可以分為以下幾組:
- 基於字節操作的接口:InputStream 和 OutputStream
- 基於字符操作的接口:Writer 和 Reader
- 基於磁盤操作的接口:File 相關
- 基於網絡操作的接口:Socket 相關
前兩個是數據格式區分,後兩個是傳輸方式區分。IO 只是人機交互的手段,除了完成交互功能,我們關註的就是如何提高他的運行效率了,而數據格式和傳輸方式是影響效率的最關鍵的因素。
基於字節操作的接口
以下是 InputStream 的類層次關系圖
其實還有很多子類沒有展示出來,每個子類對應處理不同的操作類型。
以下是 OutputStream 的類層次關系圖
兩個要點:
- 1、操作數據的方式可以組合使用
- 2、必須制定流最終寫到什麽地方:要麽是磁盤,要麽是網絡中。其實寫網絡也是寫磁盤,只是需要讓操作系統再將數據傳送到其他地方,而不是本地磁盤。
基於字符操作的接口
不管是磁盤還是網絡傳輸,最小的存儲單元都是字節,而不是字符,所以IO操作的都是字節而不是字符,但是為什麽有操作字符的IO接口呢?
這是因為我們程序操作的數據都是字符形式的,為了方便操作當然要提供直接寫字符的IO接口。
Writer 類層次結構
Reader 類層次結構
Reader 和 Writer 接口都只定義了讀取或寫入數據字符的方式,也就是怎麽讀或寫,但是沒有指明數據要寫到哪裏,這裏就涉及到磁盤或網絡的工作機制。
字節和字符轉化接口
前面說過,數據持久化或網絡傳輸都是以字節為單位進行,所以必須有字符字節轉化工具。
字符編碼類結構如圖,解碼有類似的結構;
從InputStream 到 Reader 的過程要指定編碼字符集,否則使用系統默認的字符集,很可能會出現亂碼問題。StreamDecoder 正是完成從字節到字符的解碼的實現類。
try { StringBuffer buffer = new StringBuffer(); char[] buf = new char[1024]; FileReader reader = new FileReader("file"); while (reader.read(buf) > 0) { buffer.append(buf); } buffer.toString(); } catch (Exception e) { }
FileReader 就是按照上面的工作方式讀取文件的,FileReader 繼承了 InputStreamReader ,實際上是讀取文件流,然後通過StreamDecoder 解碼成 char,只不過這裏的解碼字符集是默認字符集。
通過 OutputStreamWriter 類完成了從字符到字節的編碼過程,由 StreamEncoder 完成編碼過程。
java 的IO類庫的基本架構