SpringBoot读取Resource下文件的几种方式

Stella981
• 阅读 489

最近在项目中涉及到Excle的导入功能,通常是我们定义完模板供用户下载,用户按照模板填写完后上传;这里待下载模板位置为resource/excelTemplate/test.xlsx,尝试了四种读取方式,并且测试了四种读取方式分别的windows开发环境下(IDE中)读取和生产环境(linux下jar包运行读取)。
第一种:

ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx");
InputStream inputStream =classPathResource.getInputStream();

第二种:

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");

第三种:

InputStream inputStream = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");

第四种:

File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);

经测试:
前三种方法在开发环境(IDE中)和生产环境(linux部署成jar包)都可以读取到,第四种只有开发环境 时可以读取到,生产环境读取失败。
推测主要原因是springboot内置tomcat,打包后是一个jar包,无法直接读取jar包中的文件,读取只能通过类加载器读取。
前三种都可以读取到其实殊途同归,直接查看底层代码都是通过类加载器读取文件流,类加载器可以读取jar包中的编译后的class文件,当然也是可以读取jar包中的excle模板了。
用解压软件打开jar包查看结果如下:

SpringBoot读取Resource下文件的几种方式

其中cst文件中是编译后class文件存放位置,excleTemplate是模板存放位置,类加载器读取的是cst下class文件,同样可以读取excleTemplate下的模板的文件流了。
所以总结一下:假如文件是在jar包中,读取方式应当使用基于类加载器读取文件流的方式,比如前三种方法;使用基于java中File方式的读取,在jar包情况下是读取不到的,比方说第四种。

感觉对你有帮助,就点个赞吧……

点赞
收藏
评论区
推荐文章
Easter79 Easter79
2年前
springboot读取外部配置文件
springboot项目打成jar包后不好进行配置文件修改,可设置为读取外部配置文件,方便进行配置修改.步骤:1.将jar包中的application.properties配置文件复制到自定义路径下;2.运行jar包命令指定外部配置文件路径:nohupjavajar.jarspring.config.location
浩浩 浩浩
3年前
golang 读取文件的四种方式
读文件读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件读文件方式一:利用ioutil.ReadFile直接从文件读取到byte中funcRead0()(string){f,err:ioutil.ReadFile("file/test")iferrn
徐小夕 徐小夕
3年前
3分钟教你用原生js实现具有进度监听的文件上传预览组件
本文主要介绍如何使用原生js,通过面向对象的方式实现一个文件上传预览的组件,该组件利用FileReader来实现文件在前端的解析,预览,读取进度等功能,并对外暴露相应api来实现用户自定义的需求,比如文件上传,进度监听,自定义样式,读取成功回调等。组件设计架构如下:(https://imghelloworld.osscnbeijing.
Easter79 Easter79
2年前
springboot项目上传文件出现临时文件目录为空
<divid"cnblogs\_post\_body"class"blogpostbody"<p最近写文件上传到服务器读取的代码,前端使用FormData上传,服务端用MultipartFile接收,自己测试了下MultipartFile对象有什么东西,结果一般属性都能出来,测试getInputStrea()方法的时候出现了以下错误,简单一
Wesley13 Wesley13
2年前
Java项目读取resources资源文件路径那点事
  今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑。正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例: !(https://oscimg.oschina.net/o
Wesley13 Wesley13
2年前
Java反射机制,实现任意位置的class文件的解析
   之前一直在想如何读取一个class文件,并且获取其中的信息,Java有自己的_ClassLoader_,可以加载系统需要的class文件,或者用户自定义的class文件,但是对目录要求较高,需要时在classpath下,但是能不能将任意位置的class文件加载呢。   class文件是以二进制流的方式存在磁盘文件上的,ClassLoad
Easter79 Easter79
2年前
Springboot读取Jar文件中的resource
如题,碰到了问题.事情是这样的.一个导入模板,因为比较少,所以就直接放在后台的resources中了.调试的时候是下载没有问题的.等到发布后,下载就出问题了. 参照:\\\.jar!\\BOOTINF\\classes!\\\\\.xml没有此文件https://blog.csdn.net/weixin\_43229
Easter79 Easter79
2年前
SpringBoot读取Resource下文件的几种方式
最近在项目中涉及到Excle的导入功能,通常是我们定义完模板供用户下载,用户按照模板填写完后上传;这里待下载模板位置为resource/excelTemplate/test.xlsx,尝试了四种读取方式,并且测试了四种读取方式分别的windows开发环境下(IDE中)读取和生产环境(linux下jar包运行读取)。第一种:ClassPath
Wesley13 Wesley13
2年前
Java 获取资源文件路径
1问题描述通过源码运行时,一般使用如下方式读取资源文件:Stringstr"1.jpg";资源文件与源码文件放在同一目录下,或者拥有同一父级目录:Stringstr"a/b/1.jpg";这样直接编译运行没有问题,但是打成JAR包后会读取不了,直接抛空指针异常。2解
Stella981 Stella981
2年前
SpringBoot读取配置文件信息
application.properties配置文件的读取方式有以下两种Environment方式读取框架中有一个org.springframework.core.env.Environment类,可以读取application.properti