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

Java 讀取 Properties 配置文件:字符流 vs 字節流中文亂碼實測

     編輯:Java 相關知識

核心結論

配置文件含中文時,必須使用字符流(Reader);字節流會導致中文亂碼,因為漢字佔 2 字節,字節流按單字節讀取會破壞字符邊界。

配置文件示例

# b.properties
family\ name = zhou
second name = dingzhao
gender = male
tel no. = +86 (-) 13913462
salary = 0.001k
職業 = java & 工程師

注意:鍵值含空格、特殊字符需用 \ 轉義。

正確寫法:FileReader(字符流)

Properties props = new Properties();
try (FileReader reader = new FileReader(
        new File("I:/Workspaces/MyWork/xcserver/src/com/xiaocong/user/service/b.properties"))) {
    props.load(reader);

    // 獲取單個值
    System.out.println(props.getProperty("family name")); // zhou

    // 遍歷所有鍵值
    for (String key : props.stringPropertyNames()) {
        System.out.println(key + "=" + props.getProperty(key));
    }

    // 直接讀取中文鍵
    System.out.println(props.getProperty("職業")); // java & 工程師
} catch (IOException e) {
    e.printStackTrace();
}

錯誤寫法:BufferedInputStream(字節流)

// 會導致中文鍵/值亂碼
try (InputStream in = new BufferedInputStream(
        new FileInputStream(".../a.properties"))) {
    props.load(in);
    // 輸出:鍵「職業」變為亂碼,值「java & 工程師」也亂碼
}

關鍵 API 說明

  • props.load(Reader/InputStream):自動解析 key=value 格式,支持 # 註釋、\ 轉義、續行。
  • props.getProperty(key):獲取值,key 不存在返回 null。
  • props.stringPropertyNames():返回鍵集合(泛型安全),優於舊版 propertyNames()。

最佳實踐建議

  1. 統一編碼:配置文件保存為 UTF-8,讀取時用 new InputStreamReader(inputStream, StandardCharsets.UTF_8) 顯式指定編碼,避免系統默認編碼差異。
  2. Spring 環境:直接用 @PropertySource + Environment 或 @Value("${key}") 注入,無需手寫 IO 代碼。
  3. 敏感信息:密碼、密鑰等勿明文存放,使用 Jasypt 加密或配置中心(Nacos/Apollo)管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved