1. 为什么需要读取resource目录文件?
在SpringBoot项目中,resource目录是存放静态资源和配置文件的标配位置。这里可能放着SQL脚本、Excel模板、证书文件、配置文件等各种关键资源。但很多开发者第一次尝试读取这些文件时,往往会遇到FileNotFoundException——因为SpringBoot打包后,resource下的文件会进入jar包内部,传统的File类读取方式完全失效。
上周我就帮同事排查过一个典型问题:他本机测试时用new File("src/main/resources/init.sql")能正常运行,但打成jar包部署后脚本死活找不到。这正是因为没有掌握SpringBoot环境下读取resource文件的正确姿势。下面这六种方法,覆盖了从基础到高阶的各种场景需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 六种核心方法详解
2.1 ClassLoader.getResourceAsStream(最基础方案)
java复制InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("files/test.txt");
这是最基础的读取方式,通过类加载器获取资源流。注意几个关键点:
- 路径不需要写
/开头 - 文件不存在时返回
null而不是抛异常 - 适合读取一次性使用的资源文件
警告:不要用
getResource()获取URL再转File对象,这在jar包内会报错!
2.2 Class.getResourceAsStream(相对路径方案)
java复制// 相对路径(相对于当前类所在包)
InputStream input1 = MyClass.class.getResourceAsStream("config.properties");
// 绝对路径(从classpath根开始)
InputStream input2 = MyClass.class.getResourceAsStream("/static/logo.png");
与方案1的区别在于:
- 不写
/时路径相对于当前类所在包 - 写
/时从classpath根目录
