Properties类默认用ISO-8859-1编码读取,导致UTF-8中文乱码;应改用load(Reader)配合InputStreamReader指定UTF-8,或确保classpath路径正确、避免空值问题。

Properties 类能直接读取 .properties 文件,但必须注意编码、路径和空值处理——默认 ISO-8859-1 编码会把中文变成乱码,类路径加载容易因打包后路径变化而失败。
用 load(InputStream) 读取时为什么中文显示为乱码
因为 Properties.load(InputStream) 内部按 ISO-8859-1 解码,遇到 UTF-8 编码的中文就会出错。不是文件本身有问题,是读取方式不匹配。
- 推荐改用
load(Reader)配合InputStreamReader指定 UTF-8:try (InputStream is = getClass().getResourceAsStream("/config.properties"); Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) { props.load(reader); } - 或者提前用
native2ascii工具转义中文(不推荐,维护成本高) - Spring Boot 项目建议直接用
@Value或@ConfigurationProperties,避开手动加载
用 getResourceAsStream() 加载配置文件总返回 null
这是最常见的路径陷阱:getResourceAsStream() 的路径是相对于 classpath 的,且开头带 / 表示从 classpath 根开始查找;不带 / 则相对当前类所在包。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 确保文件真正在 classpath 下:Maven 项目放在
src/main/resources/,编译后出现在target/classes/根目录 - 路径写法要严格:
"/config.properties"✅,"config.properties"❌(除非它和当前类在同一包) - IDE 运行正常但打包后失败?检查 jar 包里是否真有该文件:
jar -tf your-app.jar | grep config.properties
读取到的属性值为什么是 null 或空字符串
getProperty(String key) 返回 null 只有一个原因:key 完全没在文件中定义(注意大小写和空格)。而空字符串通常是配置写了 key= 但等号右边为空。
立即学习“Java免费学习笔记(深入)”;
- 用
getProperty(key, defaultValue)提供兜底值,避免空指针 - 检查配置文件格式:每行只能有一个
=或:,注释用#或!开头,不能混用空格和制表符做缩进 - 调试时打印全部键值:
props.stringPropertyNames().forEach(key -> System.out.println(key + "=" + props.getProperty(key)));
真正麻烦的不是读取动作本身,而是当配置来自不同环境(dev/test/prod)、需要动态刷新、或与其他配置源(YAML、环境变量)合并时,Properties 类就力不从心了——这时候该考虑 java.util.ServiceLoader 或成熟配置库,而不是硬套这个基础类。

















