关于web项目读取classpath下面文件的心得分享
作者:有逼格d伊凡
web项目读取classpath下面文件的心得
阅读之前须知:本文用到spring的工具类和,commons-io工具类
首先分两大类按web容器分类
一种是普通的web项目,像用Tomcat容器,特点是压缩包随着容器的启动会解压缩成一个文件夹,项目访问的时候,实际是去访问文件夹,而不是jar或者war包
这种的无论你是用获取路径的方法this.getClass().getResource("/")+fileName,获取流的方法this.getClass().getResourceAsStream(failName);,屡试不爽,都行,这种没什么可注意的,大多数项目都是这种
上方便的工具类吧
import org.springframework.util.ResourceUtils; File file= ResourceUtils.getFile("classpath:test.txt");
或者
ClassPathResource classPathResource = new ClassPathResource("test.txt");
- 获取文件:classPathResource .getFile();
- 获取文件流:classPathResource .getInputStream();
第二种是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,项目实际访问时jar包或者war包
这种最容易遇坑,最大的坑就是,用第一种方式读取,在eclipse,本地调试,完美运行,到linux环境下,就GG,
首先用获取路径的方法this.getClass().getResource("/")+fileName,获取流的方法this.getClass().getResourceAsStream(failName);在本地运行时,绝壁能找到,你打印出来路径,没错,是咱们eclipse的工作目录,项目目录,但是在target目录下。
现在给你分析为什么去到线上,就GG了,很简单,线上内嵌的工程,我们只会放一个jar文件上去,我理解是jar里面的路径是获取不到的,jar是封闭性东西吧,不像文件夹,总不能c:/home/xx.jar/file.txt,这种路径我写出来你是不是心里激起一点小浪花,别浪,稳点。
所以说到这我已经吧上帝的真理告诉你了,不要告诉别人哦,这是个秘密,好,大哥我总结一点,读取jar里面的文件,我们只能用流去读取,不能用file,文件肯定要牵扯路径,jar那个路径刚刚我已经拼出来了
jar里面文件读取方式:
ClassPathResource classPathResource = new ClassPathResource("test.txt");
- 获取文件流:classPathResource .getInputStream();
web项目下读取classpath下文件--使用springboot遇到的大坑
在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因:
读取文件的三种方式
1. ResourceUtils工具类
import org.springframework.util.ResourceUtils; //使用: File file= ResourceUtils.getFile("classpath:test.txt");
2. FileInputStream文件流的方式读取
(该方式为按行读取,若不是按行处理,需要像图中将每行数据存在一个buffer中,然后转成String处理)
3. ClassPathResource获取文件流的方式
ClassPathResource classPathResource = new ClassPathResource("test.txt");
- 获取文件:classPathResource .getFile();
- 获取文件流:classPathResource .getInputStream();
不同web容器读取文件的区别
有两种常见的web容器:
1. 第一种是普通的web项目,特点是jar/war压缩包会随着容器的启动解压缩成一个文件夹,当项目访问的时候,实际是访问文件夹,而非jar或者war包。
该种方式下,用获取路径的方法:this.getClass().getResource("/")+fileName或者获取流的方法:this.getClass().getResourceAsStream(failName);都可以成功。
2. 第二种是内嵌web容器,Spring boot就是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,项目实际访问的就是jar/war包
该种方式最容易遇坑!!最大的坑就是,this.getClass().getResource("/")+fileName在本地windows下能完美找到路径,可是在linux测试服务器下就失败,所以读取jar中的文件只能用流读取,不能用file,即只能用方式三读取。
所以,用spring boot搭建的工程,只能用
classPathResource .getInputStream();获取文件流。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。