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

Java 逐行讀取文字檔:徹底解決中文亂碼問題

     編輯:Java 相關知識

問題背景

在 Java 中使用 BufferedReader 逐行讀取包含中文的文字檔時,若編碼設定不一致,輸出往往會出現亂碼。核心原因在於:作業系統預設編碼、IDE 專案編碼、檔案實際儲存編碼、程式碼中指定的讀取編碼,這四者必須完全一致。

三步驟解決方案

1. 統一編碼環境

  • 專案編碼設為 UTF-8(Eclipse:專案右鍵 → Properties → Resource → Text file encoding → UTF-8)
  • 確認文字檔儲存時編碼為 UTF-8(Notepad++ 或 VS Code 可在右下角切換)
  • Java 原始檔編碼亦為 UTF-8

2. 明確指定讀取編碼

切勿使用預設編碼的 FileReader,改用 InputStreamReader 顯式指定:

InputStreamReader isr = new InputStreamReader(
    new FileInputStream(fileUrl), "UTF-8");

3. 完整程式碼範例

import java.io.*;
import java.util.*;

public class ReadTxtUtf8 {
    public static void main(String[] args) {
        String fileUrl = "data.txt"; // 檔案路徑
        List lines = new ArrayList<>();
        
        try (InputStreamReader isr = new InputStreamReader(
                new FileInputStream(fileUrl), "UTF-8");
             BufferedReader reader = new BufferedReader(isr)) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                String trimmed = line.trim();
                if (trimmed.length() > 1) { // 過濾空白行
                    lines.add(trimmed);
                }
            }
            System.out.println("讀取完成,共 " + lines.size() + " 行有效資料");
            lines.forEach(System.out::println);
            
        } catch (UnsupportedEncodingException e) {
            System.err.println("不支援的編碼: " + e.getMessage());
        } catch (FileNotFoundException e) {
            System.err.println("找不到檔案: " + fileUrl);
        } catch (IOException e) {
            System.err.println("讀取錯誤: " + e.getMessage());
        }
    }
}

常見陷阱與補充

  • BOM 頭:UTF-8 檔案若包含 BOM (EF BB BF),首行會殘留不可見字元,建議儲存為「UTF-8 無 BOM」或程式碼中處理。
  • 大小寫:編碼字串 "UTF-8" 標準寫法,"utf-8" 亦可,但建議統一大寫。
  • Java 7+ try-with-resources:自動關閉資源,避免洩漏。
  • Files.readAllLines (Java 8+):更簡潔的替代方案 Files.readAllLines(Paths.get(fileUrl), StandardCharsets.UTF_8)。

總結

中文亂碼本質上是編碼不匹配。只要做到「專案、檔案、程式碼三方編碼一致」並「明確指定 UTF-8 讀取」,即可徹底解決。養成使用 InputStreamReader 顯式指定編碼的習慣,是避免亂碼的關鍵。

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