java io框架詳解


一. IO的分類

從數據來源或者說是操作對象角度看,IO 類可以分為:

1. 文件(file):FileInputStream、FileOutputStream、FileReader、FileWriter

2. 管道操作:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter

3. 數組([]):

    • 字節數組(byte[]):ByteArrayInputStream、ByteArrayOutputStream
    • 字符數組(char[]):CharArrayReader、CharArrayWriter

4. 緩沖操作:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter

5. 基本數據類型:DataInputStream、DataOutputStream

6. 對象序列化反序列化:ObjectInputStream、ObjectOutputStream

7. 轉換:InputStreamReader、OutputStreWriter

8. 打印:PrintStream、PrintWriter

數據源節點也可以再進行二次處理,使數據更加容易使用,所以還可以划分成節點流和處理流。

從數據傳輸方式或者說是運輸方式角度看,可以將 IO 類分為:

1、字節流

2、字符流

字節流是以一個字節單位來運輸的,比如一杯一杯的取水。而字符流是以多個字節來運輸的,比如一桶一桶的取水,一桶水又可以分為幾杯水。

字節流和字符流的區別:

字節流讀取單個字節,字符流讀取單個字符(一個字符根據編碼的不同,對應的字節也不同,如 UTF-8 編碼是 3 個字節,中文編碼是 2 個字節。)字節流用來處理二進制文件(圖片、MP3、視頻文件),字符流用來處理文本文件(可以看做是特殊的二進制文件,使用了某種編碼,人可以閱讀)。簡而言之,字節是個計算機看的,字符才是給人看的。

不可否認,Java IO 相關的類確實很多,但我們並不是所有的類都會用到,我們常用的也就是文件相關的幾個類,如文件最基本的讀寫類 File 開頭的、文件讀寫帶緩沖區的類 Buffered 開頭的類,對象序列化反序列化相關的類 Object 開頭的類。

從流的流入和流出可分為:

1. 輸入流

2. 輸出流

這里暫時不做講述

二. IO類和相關方法

IO 類雖然很多,但最基本的是 4 個抽象類:InputStream、OutputStream、Reader、Writer。最基本的方法也就是一個讀 read() 方法、一個寫 write() 方法。方法具體的實現還是要看繼承這 4 個抽象類的子類,畢竟我們平時使用的也是子類對象。這些類中的一些方法都是(Native)本地方法、所以並沒有 Java 源代碼,這里給出筆者覺得不錯的 Java IO 源碼分析 傳送門,按照上面這個思路看,先看子類基本方法,然后在看看子類中還新增了那些方法,相信你也可以看懂的,我這里就只對上后面說的常用的類進行總結。

先來看 InputStream 和 OutStream 中的方法簡介,因為都是抽象類、大都是抽象方法、所以就不貼源碼嘍!注意這里的讀取和寫入,其實就是獲取(輸入)數據和輸出數據。

再來看 Reader 和 Writer 類中的方法,你會發現和上面兩個抽象基類中的方法很像。

1、讀取控制台中的輸入

至於控制台的輸出,我們其實一直都在使用呢,System.out.println() ,out 其實是 PrintStream 類對象的引用,PrintStream 類中當然也有 write() 方法,但是我們更常用 print() 方法和 println() 方法,因為這兩個方法可以輸出的內容種類更多,比如一個打印一個對象,實際調用的對象的 toString() 方法。

2、二進制文件的寫入和讀取

注意這里文件的路徑,可以根據自己情況改一下,雖然這里的文件后綴是txt,但該文件卻是一個二進制文件,並不能直接查看。

3、文本文件的寫入和讀取

write() 方法和 append() 方法並不是像方法名那樣,一個是覆蓋內容,一個是追加內容,append() 內部也是 write() 方法實現的,也非說區別,也就是 append() 方法可以直接寫 null,而 write() 方法需要把 null 當成一個字符串寫入,所以兩者並無本質的區別。需要注意的是這里並沒有指定文件編碼,可能會出現亂碼的問題。

 

使用字節流和字符流的轉換類 InputStreamReader 和 OutputStreamWriter 可以指定文件的編碼,使用 Buffer 相關的類來讀取文件的每一行。

4、復制文件

不使用緩沖對文件復制時間的影響,文件的復制實質還是文件的讀寫。緩沖流是處理流,是對節點流的裝飾。

注:這里的時間是在我的電腦上測試得到的,只是為了說明使用緩沖對文件的讀寫有好處。

輸入輸出都是用緩沖流:

只有輸入使用緩沖流

輸入和輸出都不使用緩沖流

關於序列化和反序列化的內容,下節說

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM