Class.getResourceAsStream 是 Java 中加载 classpath 资源的标准方式,支持绝对路径(以 / 开头)和相对包路径(不以 / 开头),需确保资源在 src/main/resources 下且路径正确,使用时应判空并用 try-with-resources 管理流。

Class.getResourceAsStream 是 Java 中加载类路径(classpath)下资源文件最常用的方式,它通过 Class 对象定位并读取资源,返回一个 InputStream,适合读取配置文件、模板、图片等非代码类资源。
资源路径规则必须清楚
路径写法直接影响能否成功加载:
- 以
/开头:表示从 classpath 根目录开始查找(绝对路径),例如clazz.getResourceAsStream("/config.properties")会找src/main/resources/config.properties或classes/config.properties; - 不以
/开头:相对于当前 Class 所在包路径查找(相对路径),例如clazz.getResourceAsStream("data.json")会在和clazz同包的目录下找data.json; - 路径中使用
/分隔,不能用\,且不支持..向上跳转(JDK 限制,部分版本可能抛IllegalArgumentException)。
确保资源真正在 classpath 中
Maven 项目中,资源文件需放在 src/main/resources(或 src/test/resources)下,编译后会被复制到 target/classes/ 目录。常见误区:
- 把文件放在
src/main/java下但没加后缀(如.txt),默认不会被 Maven 打包 —— 需在pom.xml中配置resources包含该扩展名; - IDE 编译路径未同步(尤其 Eclipse),可尝试刷新项目或清理重建;
- 使用 Spring Boot 时,
getResourceAsStream仍走标准 classpath,但注意 Fat Jar 中资源是 zip 内部路径,该方法依然兼容(JDK 自动处理)。
推荐用法与安全检查
避免空指针,建议显式判空:
立即学习“Java免费学习笔记(深入)”;
InputStream is = clazz.getResourceAsStream("/logback.xml");
if (is == null) {
throw new IllegalArgumentException("Resource 'logback.xml' not found in classpath");
}
// 使用 try-with-resources 关闭流
try (InputStream stream = is) {
// 处理内容
}
也可用 Objects.requireNonNull 简化:
-
Objects.requireNonNull(clazz.getResourceAsStream("/conf/app.yml"), "app.yml missing"); - 若资源为文本,配合
new String(Files.readAllBytes(...))更方便(但注意编码,默认 UTF-8)。
对比 ClassLoader.getResourceAsStream
两者行为基本一致,但调用主体不同:
-
clazz.getResourceAsStream(path):内部委托给clazz.getClassLoader().getResourceAsStream(),自动处理路径前缀逻辑; -
clazz.getClassLoader().getResourceAsStream(path):只接受 classpath 根路径起始的路径(即必须以/开头,或直接写文件名),不支持相对包路径; - 一般优先用
Class.getResourceAsStream,语义更清晰,路径更灵活。


















