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

这篇具有很好参考价值的文章主要介绍了Spring Boot读取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");
InputStream inputStream = ResourceUtils.getURL("classpath:script/test.py").openStream();

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

好了,以上就是读取jar包中resouce目录下文件的解决方式了,还有更多其他的读取方式,欢迎小伙伴们评论区留言讨论。文章来源地址https://www.toymoban.com/news/detail-450631.html

到了这里,关于Spring Boot读取resource目录下文件失败解决方案及分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx。 看了

    2024年02月11日
    浏览(49)
  • maven打包spring boot jar没有 BOOT-INF目录解决方案

    ##查看项目里面是否有引入spring-boot-maven-plugin plugin           groupIdorg.springframework.boot/groupId           artifactIdspring-boot-maven-plugin/artifactId         /plugin ##如果有引入,还不行 ##查看pom.xml是否有pluginManagement标签,去掉pluginManagement就行了 ##去掉pluginManagement标签

    2024年01月18日
    浏览(34)
  • spring boot 下载resources下的静态文件为流格式

    废话不多说,直接上代码 一、下载逻辑 二、格式对照表 比较全面的contentType的类型值

    2024年02月07日
    浏览(34)
  • Spring Boot读取配置文件

    Spring Boot 是一种用于快速构建基于Spring的应用程序的框架,它提供了很多便利的功能和约定,使开发者可以快速搭建、配置和部署应用程序。在Spring Boot中,读取配置文件是一个非常常见的任务,本文将介绍如何在Spring Boot应用程序中读取配置文件,并使用读取到的配置信息。

    2024年02月07日
    浏览(32)
  • Java spring-boot项目中如何上传下载文件或图片到spring-boot规定的非静态目录

    spring-boot的项目,虽然它自己定义了一个静态文件的存储目录,但是这个目录一般是作为前端静态文件的目录来作为使用的。如果使用这个静态目录来作为我们上传文件的目录会有一个比较尴尬的地方:将spring-boot打包成为jar包后,随着上传图片的增多,这个jar包也会跟着变大

    2024年02月16日
    浏览(39)
  • centos下安装ftp-读取目录列表失败-

    默认路径:   /var/ftp/pub anonymous : Filezilla 传输设置要选“主动”,否则会出现 状态: 读取目录列表… 命令: PWD 响应: 257 “/” is your current location 命令: TYPE I 响应: 200 TYPE is now 8-bit binary 命令: PASV 响应: 227 Entering Passive Mode (140,143,228,107,154,6) 命令: MLSD 错误: 20 秒后无活动,连接

    2024年02月15日
    浏览(29)
  • ftp连接成功, 读取目录列表失败, 是什么原因?

    在linux云服务器搭建FTP服务器,直接使用宝塔面板简单粗暴,安全组记得放行(FTP:21端口,8888端口由宝塔web访问界面) 用filezilla、FTP Rush、 xftp等软件连接阿里云的虚拟主机服务器的FTP的时候,一直出现这个错误,读取目录列表失败,或者无法显示远程目录。 网上一堆抄来抄去

    2024年02月15日
    浏览(29)
  • Java读取resources下的文件及资源路径

    在Java开发中,经常需要读取项目中resources目录下的文件或获取资源路径。本文将介绍如何在Java中读取resources下的文件,并提供相关实例来说明。 方式一:使用ClassLoader 上述代码通过ClassLoader的 getResourceAsStream 方法获取resources目录下的 test.txt 文件的输入流,然后通过BufferedR

    2024年02月15日
    浏览(28)
  • FileZilla仅开放21端口导致连接超时错误:读取目录列表失败

    条件:         部署FileZilla Server后,在防火墙内打开21端口入站。         另一台机器使用FileZilla连接服务器,卡在如下:                 状态:    连接建立,等待欢迎消息...                 状态:    初始化 TLS 中...                 状态:    

    2024年02月05日
    浏览(29)
  • Unity中读取Json文件:基于Assets/Resources文件夹

    我好生气😤,Python,JS里面一两行代码能够搞定的Json读取,在Unity中使用C#读取Json文件超多坑,爬出来一个又来一个。 主要是JsonUtility.FromJson太不给力了。 最好的方式是,使用 https://github.com/jilleJr/Newtonsoft.Json-for-Unity 这个第三方库。详情见下。 Step 1: 先把对应的Json File放到

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包