Java读取Properties中文乱码的根本原因是其默认按ISO-8859-1解码,需通过InputStreamReader指定UTF-8编码加载;写入时推荐storeToXML或手动控制输出流;Spring项目可用@PropertySource(encoding="UTF-8")解决。

Java 读取配置文件中文乱码,核心原因是 Properties 文件默认按 ISO-8859-1 编码解析,而中文无法在该编码中表示,导致读取时字节被错误映射为问号或乱码字符(如 `æ¨å¥½`)。这不是显示问题,而是解码链路断裂——哪怕文件本身是 UTF-8 保存的,只要没绕过 Properties 的默认行为,中文就保不住。
确认配置文件真实编码
别凭感觉猜,先查实编码:
- Linux/macOS 下运行:
file -i config.properties,看输出中的charset=字段(如charset=utf-8或charset=iso-8859-1) - Windows 下用 VS Code 打开,右下角状态栏直接显示当前识别编码;若显示“UTF-8 with BOM”,说明带签名,需额外处理
- 用记事本另存为时选了“ANSI”,大概率是 GBK;用 IntelliJ 新建的文件,默认是无 BOM 的 UTF-8
读取时强制指定 UTF-8 编码
Properties 类不支持构造时传入 Charset,必须绕过其 load(InputStream) 的默认逻辑,改用能指定编码的流:
- 推荐写法(JDK 7+,安全、简洁):
try (InputStream is = Files.newInputStream(Paths.get("config.properties"));<br> Properties props = new Properties()) {<br> props.load(new InputStreamReader(is, StandardCharsets.UTF_8));<br> // 后续使用 props.getProperty("key")<br>} - 避免用
FileReader:它不接受 Charset 参数(JDK 11+ 虽有重载但已标记为不推荐),且依赖系统默认编码,跨环境极易出错 - 若必须用传统方式:
new InputStreamReader(new FileInputStream("config.properties"), "UTF-8"),注意字符串编码名必须是"UTF-8"(不是 "utf8" 或 "UTF8")
写入时也统一用 UTF-8
读对了,写错照样产生新乱码文件。Properties 的 store(OutputStream, String) 方法会把非 ISO-8859-1 字符自动转义(如 `\u4f60\u597d`),虽能保留语义,但可读性差。更优做法是:
立即学习“Java免费学习笔记(深入)”;
- 改用
storeToXML():天然支持 UTF-8,生成 XML 格式,中文原样保留 - 或手动控制输出流:
try (OutputStream os = Files.newOutputStream(Paths.get("config.properties"));<br> PrintWriter pw = new PrintWriter(os, false)) {<br> props.store(pw, null); // 注意:这里仍走默认逻辑,慎用<br> // 更稳妥:逐行 write + escape,或换用第三方库如 Apache Commons Configuration
Spring 项目可直接用 @PropertySource
如果是 Spring Boot 项目,无需手写读取逻辑:
- 在
@Configuration类上加:@PropertySource(encoding = "UTF-8", value = "classpath:config.properties") - 确保
application.properties或bootstrap.properties本身也是 UTF-8 编码保存(IDE 中右下角确认) - 配合
@Value("${key}")或Environment获取,Spring 内部已做编码适配


















