在 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 位)為單位 |
處理物件 | 處理所有型別的檔案,包括文字和二進位制檔案 | 專門用於處理文字資料 |
編碼問題 | 不考慮字元編碼,直接讀寫二進位制資料 | 需要處理字元編碼和解碼 |
常用基類 | InputStream 和 OutputStream |
Reader 和 Writer |
適用場景 | 處理圖片、音訊、影片等二進位制檔案 | 處理文字檔案,如 .txt , .csv 等 |
4. 兩者的關係
儘管位元組流和字元流處理的資料單位不同,但字元流本質上是基於位元組流實現的。字元流是對位元組流的封裝,它透過字元編碼(如 UTF-8)將位元組轉換為字元或將字元轉換為位元組。因此,在實際使用中,字元流依賴於位元組流。
字元流與位元組流的橋樑:
-
InputStreamReader
和OutputStreamWriter
是字元流和位元組流之間的橋樑,它們將位元組流轉換為字元流,或者將字元流轉換為位元組流。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"); // 將字元流轉換為位元組流
總結:
- 位元組流 處理二進位制資料,適合圖片、影片、音訊等檔案的操作。
- 字元流 處理文字資料,專門為字元操作設計,能正確處理字元編碼。
- 字元流本質上是對位元組流的封裝,依賴於位元組流的底層操作,並透過字元編碼實現位元組到字元的轉換。
在選擇使用位元組流還是字元流時,通常基於資料的型別來決定:如果是文字資料,優先選擇字元流;如果是二進位制資料或不需要考慮編碼的情況,使用位元組流更合適。