Java位元組流和字元流的區別及如何區分輸入流和輸出流

2020-07-16 10:05:19
本節主要講解 Java 位元組流和字元流的區別,以及如何區分 Java 輸入流和輸出流。

Java位元組流和字元流的區別

首先我們先大概總結一下前面學習的內容,可分為以下幾點:
  1. 以 Stream 結尾都是位元組流,Reader 和 Writer 結尾都是字元流。
  2. InputStream 是所有位元組輸入流的父類別,OutputStream 是所有位元組輸出流的父類別。
  3. Reader 是字元輸入流的父類別,Writer 是字元輸出流的父類別。

位元組流:

  • 檔案流:FileOutputStream 和 FileInputStream
  • 緩衝流:BufferedOutputStream 和 BufferedInputStream
  • 物件流:ObjectOutputStream 和 ObjectInputStream

字元流:

  • 轉換流:InputStreamReader 和 OutputStreamWriter
  • 緩衝字元流:PrintWriter 和 BufferedReader

區別:

  1. 讀寫的時候位元組流是按位元組讀寫,字元流按字元讀寫。
  2. 位元組流適合所有型別檔案的資料傳輸,因為計算機位元組(Byte)是電腦中表示資訊含義的最小單位。字元流只能夠處理純文字資料,其他型別資料不行,但是字元流處理文字要比位元組流處理文字要方便。
  3. 在讀寫檔案需要對內容按行處理,比如比較特定字元,處理某一行資料的時候一般會選擇字元流。
  4. 只是讀寫檔案,和檔案內容無關時,一般選擇位元組流。

區分輸入流和輸出流

對於初學者,看到輸入流與輸出流的部分,大部分都不明白到底是輸入流寫入還是輸出流寫入檔案呢?要將檔案讀出是用輸入流還是輸出流呢?程式在記憶體中執行,檔案在磁碟上,把檔案從磁碟上讀入記憶體中來,這就需要輸入流。反之,把記憶體中的資料寫到磁碟上的檔案裡就需要輸出流。

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")));