SpringBoot读取resource目录下文件失败的原因及解决方案

 更新时间:2023年08月18日 11:16:37   作者:明天再去学习  
在idea中运行时,有些resource下文件读取工具类能够正常获取读取到文件,但是通过java–jar的方式去运行jar包,此时resource下文件读取工具类读取文件就失效了,本文就给大家介绍一下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文件失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WebSocket实现Web聊天室功能

    WebSocket实现Web聊天室功能

    这篇文章主要为大家详细介绍了WebSocket实现Web聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java中的正则操作方法总结

    java中的正则操作方法总结

    关于正则表达式的使用,更多的是自己的经验,有兴趣可以参阅相关书籍。这里主要写一下java中的正则操作方法
    2013-10-10
  • 用JAVA 设计生成二维码详细教程

    用JAVA 设计生成二维码详细教程

    本文主要介绍用JAVA 设计生成二维码,这里一步一步详细介绍用 java 如何设计二维码,并附有代码示例以便参考,有需要的小伙伴可以参考下
    2016-08-08
  • Java用数组实现循环队列的示例

    Java用数组实现循环队列的示例

    下面小编就为大家带来一篇Java用数组实现循环队列的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • JavaMail实现发送超文本(html)格式邮件的方法

    JavaMail实现发送超文本(html)格式邮件的方法

    这篇文章主要介绍了JavaMail实现发送超文本(html)格式邮件的方法,实例分析了java发送超文本文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 为什么不要使用 async void的原因分析

    为什么不要使用 async void的原因分析

    这篇文章主要介绍了为什么不要使用 async void的原因分析及解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • java实现员工工资管理系统

    java实现员工工资管理系统

    这篇文章主要为大家详细介绍了java实现员工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java 学习笔记(入门篇)_java的基础语法

    java 学习笔记(入门篇)_java的基础语法

    从基础语法开始,这个语法你也可以理解为英语或是汉语里面的语法,只不过大家各有各的特点和区别;那么在学习的过程中我们就要不断的积累重要的类和方法,这样写程序就会方便快捷了,下面就开始学习java的基础语法
    2013-01-01
  • 一起来看看springboot集成redis的使用注解

    一起来看看springboot集成redis的使用注解

    这篇文章主要为大家详细介绍了springboot集成redis的使用注解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Elasticsearch模糊查询详细介绍

    Elasticsearch模糊查询详细介绍

    这篇文章主要给大家介绍了关于Elasticsearch模糊查询的相关资料,在数据库查询中模糊查询是一种强大的技术,可以用来搜索与指定模式匹配的数据,需要的朋友可以参考下
    2023-09-09

最新评论