根本原因是properties.load(inputstream)硬编码使用iso-8859-1解码,而文件多为utf-8;应确保utf-8无bom,并用inputstreamreader+standardcharsets.utf_8加载reader,或spring boot中配置setfileencoding("utf-8")。

Java 中读取 .properties 文件出现中文乱码,根本原因不是文件本身有问题,而是 Properties.load(InputStream) 方法**硬编码使用 ISO-8859-1 解码字节流**,而现代开发中文件几乎都以 UTF-8 保存。只要绕过这个默认路径,显式指定 UTF-8 编码,就能彻底解决。
确保文件是 UTF-8 无 BOM 格式
这是前提,否则后续操作可能失败:
- 用 VS Code、IntelliJ 或 Notepad++ 打开文件,检查右下角编码显示是否为 “UTF-8”(不是 “UTF-8 with BOM”)
- 若显示带 BOM,选择“另存为 → 编码 → UTF-8”,BOM 会导致首行 key 解析失败
- 文件内容应直接写中文,例如
user.name=张三,不要用user.name=\u5f20\u4e09(除非已有遗留转义)
用 Reader 显式指定 UTF-8 加载
这是最推荐、最通用的方案,适用于 JDK 8 及以上所有版本:
- 不调用
props.load(InputStream),改用props.load(Reader) - 用
InputStreamReader包装原始流,并传入StandardCharsets.UTF_8 - classpath 下加载示例:
Properties props = new Properties();<br>try (InputStream is = getClass().getResourceAsStream("/config.properties");<br> Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {<br> props.load(reader);<br>}
Spring Boot 项目中的适配方式
Spring Boot 底层仍用 Properties 类,但提供了更高层配置入口:
- 若需全局生效,可声明
PropertySourcesPlaceholderConfigurerBean 并设编码:
@Bean<br>public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {<br> PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();<br> configurer.setFileEncoding("UTF-8");<br> return configurer;<br>}
- 更现代的做法是放弃手动读
.properties,改用@ConfigurationProperties绑定类型安全配置类,Spring Boot 2.2+ 默认支持 UTF-8 读取
避免踩坑的几个关键点
这些细节常被忽略,却直接影响是否成功:
- 别用
new FileInputStream("xxx.properties")直接传给load()—— 它没有编码参数,必然走 ISO-8859-1 - 磁盘文件读取请用
Files.newBufferedReader(Paths.get("xxx.properties"), UTF_8),而非原始流 - 如果必须兼容老系统或已有大量
\uXXXX转义内容,原生load(InputStream)也能正确解析,无需改动 - 写入中文时同样要用
store(Writer)+OutputStreamWriter指定 UTF-8,否则新写入内容会变乱码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











