java读取.properties中文乱码主因是properties默认用iso-8859-1解码而文件存为utf-8,须确保文件utf-8无bom、用inputstreamreader(utf_8)加载、spring boot需配置fileencoding和spring.messages.encoding。

Java 处理 .properties 文件中文乱码的核心在于:Properties 类默认用 ISO-8859-1 解码字节流,而现代项目普遍用 UTF-8 保存中文,二者不匹配就导致乱码。这不是文件损坏,而是编码链路中某一层解码方式错了。关键要分清“文件怎么存”“IDE 怎么看”“程序怎么读”三层,各自处理。
文件本身必须是 UTF-8(无 BOM)
这是所有后续操作的前提。
- 在 VS Code、IntelliJ 或 Notepad++ 中保存时,明确选择 UTF-8 without BOM;
- 避免勾选 “UTF-8 with BOM”,否则开头的
EF BB BF字节会让 Java 读取器误判; - 可用十六进制工具(如 HxD)验证:“你好” 应显示为
E4 BD A0 E5 A5 BD,而不是EF BB BF E4 BD A0...; - 若已有带 BOM 的文件,另存为“UTF-8 no BOM”即可,无需重写内容。
读取时必须用 UTF-8 Reader 加载
不要调用 props.load(InputStream),它强制走 ISO-8859-1 路径,中文已不可逆损坏。
改用支持编码参数的 load(Reader):
Properties props = new Properties();
try (InputStream is = getClass().getResourceAsStream("/config.properties");
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
props.load(reader); // ✅ 正确:UTF-8 字节原样进,转义序列仍由 Properties 自动解析
}
-
getResourceAsStream()适用于 classpath 下的资源; - 若读磁盘文件,用
Files.newBufferedReader(Paths.get("config.properties"), UTF_8); - Java 9+ 还可考虑
loadFromXML()配合 UTF-8 XML 格式,但需重构配置结构。
不推荐的补救方案(仅应急)
当无法修改读取代码(如老系统封装死),且确认文件是 UTF-8 明文时,可对读出的乱码字符串做“反向修复”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
String raw = props.getProperty("name"); // 可能是 "ä½ å¥½"
String fixed = new String(raw.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
⚠️ 这本质是把被错误解码的字符串,再按原逻辑“倒推回去”。但它依赖乱码形态稳定,极易出错,不应作为常规手段。
Spring Boot 项目额外注意
-
@PropertySource和Environment加载.properties仍走原生Properties机制; - 可注册
PropertySourcesPlaceholderConfigurer指定编码:
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setFileEncoding("UTF-8");
return configurer;
}
- 国际化
messages_zh_CN.properties还需在application.properties中加:spring.messages.encoding=UTF-8
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










