SpringBoot读取resource目录下文件失败的原因及解决方案
作者:明天再去学习
一、背景
最近有个需求,就是需要从resource目录下读取文件返回给用户。在idea中运行时,有些resource下文件读取工具类能够正常获取读取到文件。但是通过java –jar的方式去运行jar包,此时resource下文件读取工具类读取文件就失效了。通过查询搜索,了解到了是读取的方式导致文件读取失败。
二、具体代码实现
1、错误的resource下文件读取写法
这部分代码展示的是通过运行jar包,ClassPathResource工具无法正常读取到文件
// 读取resource目下脚本模板文件 String templatePath = "/script/test.py"; ClassPathResource resource = new ClassPathResource(templatePath); File file; try { file = resource.getFile(); } catch (IOException e) { e.printStackTrace(); }
此处的主要做法是:通过ClassPathResource定位到resource目录下的文件,再通过他去拿到File类型的文件,通过实践证明,拿到的File是空的,说明这种方式获取文件存在问题。
2、正确的resource下文件读取写法
// 读取resource目下脚本模板文件 String templatePath = "/script/test.py"; ClassPathResource resource = new ClassPathResource(templatePath); BufferedInputStream bis = new BufferedInputStream(resource.getInputStream());
以上的主要做法是:通过ClassPathResource定位到resource目录下的文件,我们只需要从ClassPathResouce对象中拿到输入流即可,通过实践证明,通过这种方式能够正常拿到文件输入流。
三、问题分析
为什么在打成jar包之后,不支持文件通过File定位,只能通过流或在其他方式,抱着疑惑的态度,我进入ClassPathResource类查看是否有什么提示,结果还真找到了,看如下:
** * {@link Resource} implementation for class path resources. Uses either a * given {@link ClassLoader} or a given {@link Class} for loading resources. * * <p>Supports resolution as {@code java.io.File} if the class path * resource resides in the file system, but not for resources in a JAR. * Always supports resolution as URL. * * @author Juergen Hoeller * @author Sam Brannen * @since 28.12.2003 * @see ClassLoader#getResourceAsStream(String) * @see Class#getResourceAsStream(String) */ public class ClassPathResource extends AbstractFileResolvingResource {
定位这一句话:
* <p>Supports resolution as {@code java.io.File} if the class path * resource resides in the file system, but not for resources in a JAR. * Always supports resolution as URL.
百度大致翻译如下:
如果类路径资源驻留在文件系统中,则支持解析为java.io.File,但不支持JAR中的资源。始终支持URL解析)。
所以大致可以理解为,我们通过java –jar运行的方式,是无法将resource下的文件解析为java.io.File的。所以当我们使用ClassPathResouce时,就可以从中读取到文件流,或者转化为URL方式进行读取。
至于为什么不能解析为java.io.File,这个感兴趣的小伙伴可以去探索一下(我大概猜测一下:jar包就是一个压缩包,在压缩的情况下无法解析到文件路径,而且也无法通过File去定位到jar包中的文件)。
四、其他方式读取resource目录下文件
InputStream inputStream = this.getClass().getClassLoader().getResource("/script/test.py" ).openStream(); InputStream inputStream = this.getClass().getResourceAsStream("/script/test.py"); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/script/test.py");
总结:可以看出,以上最终都是通过resource相关工具定位到文件后,从中拿到输入流进行读取的。
到此这篇关于SpringBoot读取resource目录下文件失败的原因及解决方案的文章就介绍到这了,更多相关SpringBoot读取resource文件失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- Spring Boot获取resources目录下的文件三种方式详解
- springboot项目读取resources目录下的文件的9种方式
- Springboot 项目读取Resources目录下的文件(推荐)
- Spring Boot读取resources目录文件方法详解
- SpringBoot中读取jar包中的resources目录下的文件的三种方式
- SpringBoot读取Resource目录下文件的四种方式总结
- 详解SpringBoot读取resource目录下properties文件的常见方式
- SpringBoot实现本地上传文件到resources目录
- SpringBoot如何读取resources目录下的文件
- Spring Boot项目获取resources目录下文件并返回给前端的方案