Properties.load() 读不到 classpath 文件因误用 FileInputStream,应改用 getClass().getClassLoader().getResourceAsStream();load() 解析 key=value 文本(默认 ISO-8859-1),loadFromXML() 专用于 XML 格式;Spring Boot 中应避免手动 new Properties,优先用 @ConfigurationProperties;Properties 单操作线程安全但复合操作不安全,高并发建议用 ConcurrentHashMap。
Properties.load() 为什么读不到 classpath 下的配置文件
常见现象是 FileNotFoundException,尤其当用 new FileInputStream("config.properties") 直接构造时——这会从当前工作目录(如 IDEA 的 project root)找文件,而非 classpath。正确做法是走类加载器路径:
- 用
getClass().getClassLoader().getResourceAsStream("config.properties"),确保从 classpath 根开始查找 - 若配置在子包(如
conf/app.properties),路径要写全:"conf/app.properties" - 注意返回值可能为
null,务必判空,否则触发NullPointerException
Properties.load() 和 loadFromXML() 的实际区别在哪
二者语法和用途完全不同,不能混用:
-
load()解析 key=value 形式的纯文本,支持#或!开头的注释,但不校验编码,默认按 ISO-8859-1 读取;中文需提前用native2ascii转义或改用load(new InputStreamReader(in, "UTF-8")) -
loadFromXML()只接受标准 XML 格式(b),天然支持 UTF-8,无需转义,但写起来麻烦,且不兼容传统 .properties 文件 - 别对 XML 文件调
load(),会抛InvalidPropertiesFormatException
Spring Boot 里还该手动 new Properties 吗
在 Spring Boot 环境中,直接 new Properties 并手动 load 属于重复造轮子,容易绕过自动配置机制: