SpringBoot读取Resource下文件的4种方法


Posted in Java/Android onJuly 02, 2021

SpringBoot读取Resource下文件

最近在项目中涉及到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下文件的4种方法

其中cst文件中是编译后class文件存放位置,excleTemplate是模板存放位置,类加载器读取的是cst下class文件,同样可以读取excleTemplate下的模板的文件流了。

所以总结一下:

假如文件是在jar包中,读取方式应当使用基于类加载器读取文件流的方式,比如前三种方法;使用基于java中File方式的读取,在jar包情况下是读取不到的,比方说第四种。

SpringBoot打包后无法读取Resource下的配置文件的解决

SpringBoot读取Resource下文件的4种方法

有个小程序需要读取这个证书

解决办法:

private InputStream getZs(){
    ClassPathResource classPathResource = new ClassPathResource("Pinfeng1120845.Prod.p12");
    InputStream inputStream = null;
    try {
        inputStream = classPathResource.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return inputStream;
}

用上面这个种方法读取在jar包内 和 IDEA里都可以读取到!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
SpringBoot SpringEL表达式的使用
Jul 25 Java/Android
使用springMVC所需要的pom配置
Sep 15 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Android 中的类文件和类加载器详情
Jun 05 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 Java/Android
volatile保证可见性及重排序方法
Aug 05 Java/Android
Java基础-封装和继承
Java 泛型详解(超详细的java泛型方法解析)
SpringBoot集成Druid连接池连接MySQL8.0.11
Java使用httpRequest+Jsoup爬取红蓝球号码
使用Springboot实现健身房管理系统
Java Kafka 消费积压监控的示例代码
springboot临时文件存储目录配置方式
Jul 01 #Java/Android
You might like
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP使用数组实现队列
2012/02/05 PHP
php实现文件编码批量转换
2014/03/10 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python 阶乘累加和的实例
2019/02/01 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
python中取绝对值简单方法总结
2020/07/24 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
亲子活动总结
2014/04/26 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年双拥工作总结
2015/04/08 职场文书
军事理论课感想
2015/08/11 职场文书