ClassLoader读取classpath配置文件需注意:路径不加斜杠、优先用getResourceAsStream、Properties加载指定UTF-8编码、判空并用try-with-resources关闭流。

用ClassLoader读取classpath下的变量配置文件(如application.properties、db.cfg等),关键不在“能不能读”,而在于“路径怎么写、流怎么关、异常怎么兜”。下面几条是实战中真正容易出错又高频使用的技巧。
路径写法:不加斜杠,从classpath根开始算
ClassLoader的getResourceAsStream(path)方法要求path是相对于classpath根的路径,且不能以/开头。比如:
- 配置文件在
src/main/resources/config/app.properties→ 写成"config/app.properties" - 配置文件在
src/main/resources/logback.xml→ 写成"logback.xml" - 错误写法:
"/config/app.properties"或"/app.properties"→ 返回null
推荐用getResourceAsStream,别用getResource再转File
getResource返回URL,再调url.getFile()转File对象,在JAR包或某些容器环境下会失败(比如路径含空格、中文,或资源在jar内时getFile()返回非法路径)。而getResourceAsStream直接返回输入流,稳定且轻量:
- ✅ 正确:
InputStream is = clazz.getClassLoader().getResourceAsStream("app.properties"); - ❌ 风险操作:
URL url = ...getResource("app.properties"); new File(url.getFile())
加载Properties要记得指定字符集,避免乱码
默认Properties.load(InputStream)使用ISO-8859-1编码,读取UTF-8写的中文配置会乱码。应改用带Reader的重载方法:
- ✅ 推荐写法:
properties.load(new InputStreamReader(is, StandardCharsets.UTF_8)); - ⚠️ 注意:不要用
new String(byte[], "UTF-8")去处理整个流字节数组,容易丢行尾换行符或读不全
务必检查流是否为null,并及时关闭
资源不存在时getResourceAsStream返回null,不判空直接.read()会抛NullPointerException。建议用try-with-resources自动释放:
- ✅ 安全模板:
if (is == null) throw new IllegalArgumentException("配置文件 app.properties 未找到");
Properties p = new Properties();
p.load(new InputStreamReader(is, StandardCharsets.UTF_8));
// 使用p.getProperty(...)...
}
不复杂但容易忽略


















