本節主要講解 Java 位元組流和字元流的區別,以及如何區分 Java 輸入流和輸出流。
Java位元組流和字元流的區別
首先我們先大概總結一下前面學習的內容,可分為以下幾點:
-
以 Stream 結尾都是位元組流,Reader 和 Writer 結尾都是字元流。
-
InputStream 是所有位元組輸入流的父類別,OutputStream 是所有位元組輸出流的父類別。
-
Reader 是字元輸入流的父類別,Writer 是字元輸出流的父類別。
位元組流:
-
檔案流:FileOutputStream 和 FileInputStream
-
緩衝流:BufferedOutputStream 和 BufferedInputStream
-
物件流:ObjectOutputStream 和 ObjectInputStream
字元流:
-
轉換流:InputStreamReader 和 OutputStreamWriter
-
緩衝字元流:PrintWriter 和 BufferedReader
區別:
-
讀寫的時候位元組流是按位元組讀寫,字元流按字元讀寫。
-
位元組流適合所有型別檔案的資料傳輸,因為計算機位元組(Byte)是電腦中表示資訊含義的最小單位。字元流只能夠處理純文字資料,其他型別資料不行,但是字元流處理文字要比位元組流處理文字要方便。
-
在讀寫檔案需要對內容按行處理,比如比較特定字元,處理某一行資料的時候一般會選擇字元流。
-
只是讀寫檔案,和檔案內容無關時,一般選擇位元組流。
區分輸入流和輸出流
對於初學者,看到輸入流與輸出流的部分,大部分都不明白到底是輸入流寫入還是輸出流寫入檔案呢?要將檔案讀出是用輸入流還是輸出流呢?程式在記憶體中執行,檔案在磁碟上,把檔案從磁碟上讀入記憶體中來,這就需要輸入流。反之,把記憶體中的資料寫到磁碟上的檔案裡就需要輸出流。
Windows 裡所說的寫(將內容寫入到檔案裡,如:存檔)是輸入,而讀(把內容從檔案裡讀出來,如:顯示)是輸出,與 Java 的輸入輸出不一樣。Java 裡的輸入流與輸出流是針對記憶體而言的,它是從記憶體中讀寫,而不是所說的顯示與存檔。輸入流與輸出流都可以將內容從螢幕上顯示出來。
螢幕和鍵盤也是區別於記憶體的裝置,
System.out.println()
用於將記憶體中的資料輸出到螢幕上,而
System.in
用來在終端讀取鍵盤輸入內容。
程式操作的資料都應該是在記憶體裡面,記憶體是操作的主物件,把資料從其他資源中傳送到記憶體,就是輸入。反之,把資料從記憶體傳送到其他資源,就是輸出。
不管從磁碟、網路還是鍵盤讀,讀到記憶體中就是 InputStream。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("infilename")));
不管寫到磁碟、網路,或者寫到螢幕,都是使用 OutputStream。例如:
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("outfilename")));