根本原因是Properties.load(InputStream)默认用ISO-8859-1解析,解决关键是读取时用InputStreamReader显式指定UTF-8编码,并确保文件本身为UTF-8(无BOM),写入也需用UTF-8 Writer。

Java 读取 properties 文件时出现中文乱码,根本原因在于 Properties.load(InputStream) 默认使用 ISO-8859-1 编码解析字节流,而中文在 UTF-8 下占多个字节,用 ISO-8859-1 解析就会错乱。解决的关键不是改文件保存方式,而是**在读取时显式指定 UTF-8 字符集**。
确保配置文件本身是 UTF-8 编码
这是前提,否则后续读取再正确也无济于事:
- 用记事本、VS Code、IDEA 等编辑器打开
config.properties,确认右下角显示“UTF-8”(不含 BOM 更稳妥) - 避免从 Excel 或微信直接复制中文到配置文件——容易带全角等号、不可见空格或 BOM 头
- 等号
=和冒号:必须是 ASCII 字符,不能是中文符号
读取时用 InputStreamReader 显式指定 UTF-8
不要直接传 FileInputStream 给 load(),必须包装成带编码的 Reader:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 若配置文件在 classpath 下(如
src/main/resources/config.properties):
Properties props = new Properties();
props.load(new InputStreamReader(is, StandardCharsets.UTF_8));
}
- 若配置文件在 jar 包同级目录(外部可编辑):
Properties props = new Properties();
props.load(new InputStreamReader(is, StandardCharsets.UTF_8));
}
写入中文时也要指定 UTF-8
用 store() 保存修改后的内容,同样需用 Writer 指定编码,否则新写入的中文会变乱码:
- 推荐写法(JDK 7+):
props.store(writer, "updated at " + new Date());
}
- 不推荐:
props.store(new FileOutputStream(...), comment)—— 它默认用 ISO-8859-1 写入,中文必然损坏
备选方案:native2ascii 工具(兼容老项目)
如果无法修改读取代码(如依赖老旧框架),可用 JDK 自带的 native2ascii 将中文转为 Unicode 转义序列:
- 命令示例:
native2ascii -encoding UTF-8 config.properties config_unicode.properties - 转换后文件内容形如:
name=\u4f60\u597d,此时用原生load(InputStream)即可正常读取 - 缺点:配置文件可读性差,维护困难,仅作临时兼容手段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










