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

Java IO 進階:位元組流轉字元流完整指南(InputStreamReader、FileReader 最佳實踐)

     編輯:Java 綜合教學

Java IO:位元組流轉字元流完整指南

處理文本檔案時,需將位元組流(`InputStream`/`OutputStream`)轉為字元流(`Reader`/`Writer`)以正確解碼編碼。本文對比兩種標準轉換方式、緩衝層疊加、資源關閉順序與編碼陷阱。

方式一:InputStreamReader 橋接(推薦,可指定編碼)

FileInputStream fis = new FileInputStream("c:/abc.txt");        // 位元組流
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");    // 指定編碼轉字元流
BufferedReader br = new BufferedReader(isr);                    // 疊加緩衝,支援 readLine()

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

// 關閉順序:從外層往內層
br.close();
isr.close();
fis.close();

優勢:顯式指定 `Charset`,避免平台預設編碼不一致導致亂碼;可包裝任何 `InputStream`(網路、記憶體、壓縮流)。

方式二:FileReader 便捷類(不推薦生產環境)

FileReader fr = new FileReader("c:/abc.txt");  // 內部預設平台編碼
BufferedReader br = new BufferedReader(fr);

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

br.close();
fr.close();

缺點:無法指定編碼,依賴 `file.encoding` 系統屬性,跨平台部署極易亂碼;JDK 11+ 內部改用 `InputStreamReader` 但仍不暴露編碼參數。

寫入對應:OutputStreamWriter / FileWriter

// 推薦:指定編碼
FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("中文測試");
bw.newLine();
bw.close();

// 不推薦:FileWriter 無法指定編碼

資源管理最佳實踐:try-with-resources (JDK 7+)

try (FileInputStream fis = new FileInputStream("c:/abc.txt");
     InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
     BufferedReader br = new BufferedReader(isr)) {

    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} // 自動按相反順序關閉,即使發生異常也保證釋放

編碼陷阱與排查清單

  1. 檔案實際編碼 vs 讀取編碼不一致 → 亂碼(UTF-8 檔用 GBK 讀、反之)。
  2. IDE 控制台編碼與 JVM `file.encoding` 不一致 → 輸出顯示正常但檔案寫入錯誤。
  3. BOM 頭(UTF-8 BOM)導致首字符異常 → 用 `StandardCharsets.UTF_8` 讀取自動處理,或手動跳過。
  4. 網路協定指定編碼(HTTP `Content-Type: charset=utf-8`)必須遵循。

NIO.2 現代替代方案 (JDK 7+)

// 一行代碼讀取所有行,自動 UTF-8,自動關閉
List<String> lines = Files.readAllLines(Paths.get("c:/abc.txt"), StandardCharsets.UTF_8);

// 串流處理大檔案,記憶體友善
try (Stream<String> stream = Files.lines(Paths.get("c:/abc.txt"), StandardCharsets.UTF_8)) {
    stream.forEach(System.out::println);
}

掌握位元組流與字元流轉換本質,堅持顯式指定編碼、善用 try-with-resources,是寫出健壯 IO 代碼的關鍵。

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