[Java基礎]IO

Duancf發表於2024-09-28

在 Java 中,IO(輸入輸出)操作 是指對資料的讀寫操作,通常涉及檔案、網路、控制檯等。Java 提供了豐富的 IO 類和介面,主要分為兩大類:位元組流 和 字元流。它們的主要區別如下:

1. 位元組流(Byte Stream)

位元組流用於處理 原始二進位制資料,通常適合於處理所有型別的檔案,包括文字檔案、圖片、音訊、影片等。它直接操作 位元組(8 位),不考慮字元編碼。

常用的位元組流類:

  • InputStream:所有位元組輸入流的超類,負責讀取位元組資料。

    • 常見子類:FileInputStream, BufferedInputStream, ByteArrayInputStream
  • OutputStream:所有位元組輸出流的超類,負責寫入位元組資料。

    • 常見子類:FileOutputStream, BufferedOutputStream, ByteArrayOutputStream

適用場景:

  • 適合處理 非文字 檔案,比如圖片、音訊、影片等。
  • 處理 二進位制檔案 時,直接使用位元組流效率更高,因為它不會考慮字元編碼的問題。

示例程式碼:

FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");

int data;
while ((data = fis.read()) != -1) {  // 按位元組讀取
    fos.write(data);                 // 按位元組寫入
}

fis.close();
fos.close();

2. 字元流(Character Stream)

字元流用於處理 文字資料,它專門為處理字元而設計,通常適用於 文字檔案。字元流依賴於字元編碼(如 UTF-8, UTF-16 等)來將位元組轉換為字元,或者將字元轉換為位元組。

常用的字元流類:

  • Reader:所有字元輸入流的超類,負責讀取字元資料。

    • 常見子類:FileReader, BufferedReader, InputStreamReader
  • Writer:所有字元輸出流的超類,負責寫入字元資料。

    • 常見子類:FileWriter, BufferedWriter, OutputStreamWriter

適用場景:

  • 適合處理 文字檔案,因為它能正確處理不同字符集的編碼和解碼。
  • 當處理字串或文字時,使用字元流更方便,避免了手動處理位元組到字元的轉換。

示例程式碼:

FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");

int data;
while ((data = fr.read()) != -1) {  // 按字元讀取
    fw.write(data);                 // 按字元寫入
}

fr.close();
fw.close();

3. 位元組流與字元流的區別

特性 位元組流(Byte Stream) 字元流(Character Stream)
資料單位 以位元組(byte, 8 位)為單位 以字元(char, 16 位)為單位
處理物件 處理所有型別的檔案,包括文字和二進位制檔案 專門用於處理文字資料
編碼問題 不考慮字元編碼,直接讀寫二進位制資料 需要處理字元編碼和解碼
常用基類 InputStreamOutputStream ReaderWriter
適用場景 處理圖片、音訊、影片等二進位制檔案 處理文字檔案,如 .txt, .csv

4. 兩者的關係

儘管位元組流和字元流處理的資料單位不同,但字元流本質上是基於位元組流實現的。字元流是對位元組流的封裝,它透過字元編碼(如 UTF-8)將位元組轉換為字元或將字元轉換為位元組。因此,在實際使用中,字元流依賴於位元組流。

字元流與位元組流的橋樑:

  • InputStreamReaderOutputStreamWriter 是字元流和位元組流之間的橋樑,它們將位元組流轉換為字元流,或者將字元流轉換為位元組流。

    • InputStreamReader:將 InputStream 轉換為 Reader,即位元組流轉換為字元流。
    • OutputStreamWriter:將 OutputStream 轉換為 Writer,即字元流轉換為位元組流。

示例程式碼(使用轉換流):

InputStream inputStream = new FileInputStream("input.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");  // 將位元組流轉換為字元流

OutputStream outputStream = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");  // 將字元流轉換為位元組流

總結:

  • 位元組流 處理二進位制資料,適合圖片、影片、音訊等檔案的操作。
  • 字元流 處理文字資料,專門為字元操作設計,能正確處理字元編碼。
  • 字元流本質上是對位元組流的封裝,依賴於位元組流的底層操作,並透過字元編碼實現位元組到字元的轉換。

在選擇使用位元組流還是字元流時,通常基於資料的型別來決定:如果是文字資料,優先選擇字元流;如果是二進位制資料或不需要考慮編碼的情況,使用位元組流更合適。

相關文章