首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java IO 字符流深度解析:Reader/Writer 體系、緩衝優化與編碼陷阱

     編輯:Java 相關知識

字符流本質:字節流 + 解碼器。讀取二進制數據,按指定編碼(默認平台編碼)解碼為字符;寫入時編碼為字節。核心關係:字符流 = 字節流 + 解碼/編碼。

一、字符輸入流:Reader 體系

Reader 為抽象基類,FileReader 為文件字符輸入流實現。

標準讀取步驟

  1. 定位目標文件(File 對象)
  2. 建立通道(new FileReader(file))
  3. 創建緩衝區(字符數組)
  4. 循環讀取(read(char[]) 返回實際讀取字符數)
  5. 關閉資源

低效寫法(單字符讀取)

FileReader frd = new FileReader(file);
int content;
while ((content = frd.read()) != -1) {
    System.out.print((char) content); // 極慢,每次調用 native 方法
}
frd.close();

高效寫法(批量讀取 + 緩衝區)

FileReader frd = new FileReader(file);
char[] buffer = new char[1024];
int len;
while ((len = frd.read(buffer)) != -1) {
    System.out.println(new String(buffer, 0, len)); // 按實際長度構造字符串
}
frd.close();

二、字符輸出流:Writer 體系

Writer 為抽象基類,FileWriter 為文件字符輸出流實現。

關鍵機制與注意點

  1. 內部緩衝:FileWriter 內部維護 1024 字符緩衝區,數據先寫入緩衝區,滿或 flush()/close() 時才刷盤
  2. 追加模式:new FileWriter(file, true) 第二參數 true 開啟追加
  3. 自動創建:文件不存在會自動創建

標準寫入示例

File file = new File("D:\\a.txt");
FileWriter fwt = new FileWriter(file, true); // 追加模式
fwt.write("持續授課");
fwt.close(); // 隱含 flush()

三、字符流複製圖片失敗的根因

// 錯誤示範:字符流複製二進制文件
FileReader frd = new FileReader(src);
FileWriter fwt = new FileWriter(dest);
char[] ch = new char[1024];
int len;
while ((len = frd.read(ch)) != -1) {
    fwt.write(ch, 0, len);
    fwt.flush();
}

失敗原因:

  1. 圖片為二進制數據,無對應字符編碼映射
  2. 解碼時按平台編碼(如 GBK)查表,大量字節無對應字符 → 替換為未知字符()
  3. 編碼寫入時未知字符被丟棄或錯誤編碼 → 數據損壞,圖片無法打開

四、選型原則:何時用字節流?何時用字符流?

場景推薦流類型理由
圖片、視頻、音頻、壓縮包等二進制文件字節流(InputStream/OutputStream)無需解碼,直接操作字節,保證數據完整性
文本文件、XML、JSON、CSV、屬性配置等字符流(Reader/Writer)需按編碼解碼為字符,便於文本處理
網絡傳輸、序列化、隨機訪問文件字節流底層協議基於字節,字符流會引入額外編碼開銷

五、最佳實踐:緩衝流包裝

無論字節流還是字符流,生產代碼務必包裝緩衝流:

// 字符流緩衝
BufferedReader br = new BufferedReader(new FileReader(file));
BufferedWriter bw = new BufferedWriter(new FileWriter(file));

// 字節流緩衝
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));

緩衝流大幅減少系統調用次數,是 IO 效能優化的第一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved