Java中读取类路径下属性文件应使用ClassLoader.getResourceAsStream(),路径不以斜杠开头,推荐优先用上下文类加载器,次选当前类的类加载器,并需校验输入流非空及妥善处理异常。

Java 中通过 ClassLoader 读取类路径下的属性配置文件(如 application.properties 或 config.properties),核心是利用 ClassLoader.getResourceAsStream() 方法获取输入流,再用 Properties 加载。关键在于路径写法、类加载器选择和资源存在性判断。
使用当前类的 ClassLoader 获取资源流
推荐方式:通过当前类的 getClass().getClassLoader() 获取系统类加载器(或上下文类加载器),调用 getResourceAsStream(String)。路径为相对于类路径根目录的斜杠分隔路径,不以斜杠开头。
- ✅ 正确写法:
"config.properties"(位于src/main/resources/config.properties) - ✅ 正确写法:
"com/example/app/db.properties"(位于src/main/resources/com/example/app/db.properties) - ❌ 错误写法:
"/config.properties"(带前导斜杠会失效)
完整读取示例(含异常与空值处理)
以下是一个健壮的读取方法:
public static Properties loadProperties(String fileName) {
Properties props = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (loader == null) {
loader = MyClass.class.getClassLoader(); // 回退到当前类的类加载器
}
try (InputStream is = loader.getResourceAsStream(fileName)) {
if (is == null) {
throw new IllegalArgumentException("配置文件未找到: " + fileName);
}
props.load(is);
} catch (IOException e) {
throw new RuntimeException("读取配置文件失败: " + fileName, e);
}
return props;
}
注意:Thread.currentThread().getContextClassLoader() 在 Web 容器(如 Tomcat)或框架(如 Spring)中更可靠,能正确识别模块/部署单元的类路径。
立即学习“Java免费学习笔记(深入)”;
区分 ClassLoader 和 Class 的 getResourceAsStream
Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream() 路径解析规则不同:
-
MyClass.class.getResourceAsStream("a.txt"):相对路径按MyClass所在包查找;绝对路径需写"/a.txt" -
MyClass.class.getClassLoader().getResourceAsStream("a.txt"):始终从类路径根开始查找,路径不能以/开头
统一推荐用后者,语义清晰、行为确定,避免因包结构导致路径歧义。
常见问题与排查建议
如果读不到文件,检查以下几点:
- 确认文件已编译/打包进
classes/或 JAR 的根目录(IDE 中看out/production/或target/classes/) - Maven 项目确保
src/main/resources已被 Maven Resources Plugin 处理(默认支持) - IDE 运行时检查 “Build project automatically” 是否开启,或手动执行 Build
- 打印
loader.getResource("config.properties")返回的 URL,验证路径是否可访问


















