java中properties写入中文乱码的根本原因是store()默认使用iso-8859-1编码,解决方法是用outputstreamwriter指定utf-8编码调用store(writer, string),读取时也需用utf-8 reader,或接受unicode转义兼容旧规范。

Java 中用 Properties 写入配置文件时出现中文乱码,根本原因是 Properties.store() 默认使用 ISO-8859-1 编码(即 Latin-1),它不支持直接写入 UTF-8 中文字符。即使你用 UTF-8 读取,写入时仍会把中文转成 Unicode 转义形式(如 \u4f60\u597d)或直接损坏——除非显式指定编码。
用 OutputStreamWriter + UTF-8 显式指定编码写入
这是最推荐、最可控的方式:绕过 Properties.store(OutputStream) 的默认行为,改用带指定字符集的 OutputStreamWriter,再调用 store(Writer, String) 方法。
- 不要用
store(OutputStream, String),它强制走 ISO-8859-1 - 用
store(Writer, String),传入 UTF-8 编码的OutputStreamWriter - 注释和 header 也会按 UTF-8 正确输出(前提是 Writer 编码一致)
示例代码:
Properties props = new Properties();
props.setProperty("name", "张三");
props.setProperty("desc", "这是一个测试配置");
<p>try (FileOutputStream fos = new FileOutputStream("config.properties");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
props.store(osw, "Generated by Java - UTF-8");
}</p>
避免使用 store(new FileOutputStream(...)) 直接写文件
这种写法底层调用的是 store(OutputStream, String),会把非 Latin-1 字符自动转成 \uXXXX 形式,虽然能读回,但可读性差、编辑困难,且某些工具(如 Notepad++、IDE)可能无法正确识别为 UTF-8。
- 即使文件保存为 UTF-8,内容里全是
\u4F60\u597D,不是明文中文 - 若手动编辑后保存,容易因编码不一致再次乱码
- 团队协作或运维查看时体验极差
读取时也要匹配编码,不能只解决写入
写入用了 UTF-8,读取也必须用 UTF-8,否则前功尽弃。不要依赖 Properties.load(InputStream)(它默认按 ISO-8859-1 读)。
- 用
load(Reader)配合InputStreamReader指定 UTF-8 - 或者用
loadFromXML()(XML 格式天然支持编码声明,更稳妥)
安全读取示例:
try (FileInputStream fis = new FileInputStream("config.properties");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8)) {
props.load(isr);
}
如果必须用 .properties 原生格式,接受 Unicode 转义也是一种方案
Java 规范要求 .properties 文件以 ISO-8859-1 解析,所以标准做法是把中文转成 \uXXXX。JDK 自带的 native2ascii 工具或 IDE(IntelliJ/Eclipse)可自动处理。
- 优点:完全兼容所有 Java 版本和工具链
- 缺点:配置文件不可直读,维护成本高
- 适合遗留系统或强兼容要求场景,新项目优先选 UTF-8 Writer 方案
注意:JDK 9+ 的 Properties.store(OutputStream, String) 仍不支持传入 Charset,该限制未改变。所以“指定编码写入”唯一可靠路径仍是走 Writer 重载方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











