文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot读取resource目录下文件失败解决方案及分析

2023-09-05 08:23

关注

一、背景

最近有个需求,就是需要从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. * * 

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 {

定位这一句话:

* 

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");

InputStream inputStream = ResourceUtils.getURL("classpath:script/test.py").openStream();

总结:可以看出,以上最终都是通过resource相关工具定位到文件后,从中拿到输入流进行读取的。

好了,以上就是读取jar包中resouce目录下文件的解决方式了,还有更多其他的读取方式,欢迎小伙伴们评论区留言讨论。

来源地址:https://blog.csdn.net/Staba/article/details/129230536

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯