最近在项目中涉及到Excle的导入功能,一般是咱们定义完模板供用户下载,用户按照模板填写完后上传;这里模板位置resource/excel/test.xlsx,尝试了四种读取方式,而且测试了四种读取方式分别的windows开发环境下(IDE中)读取和生产环境(linux下jar包运行读取)。
第一种:linux
ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx"); InputStream inputStream =classPathResource.getInputStream();
第二种:spring
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");
第三种:windows
InputStream inputStream = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");
第四种:tomcat
File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx"); InputStream inputStream = new FileInputStream(file);
经测试:
前三种方法在开发环境(IDE中)和生产环境(linux部署成jar包)均可以读取到,第四种只有开发环境 时能够读取到,生产环境读取失败。
推测主要缘由是springboot内置tomcat,打包后是一个jar包,所以经过文件读取获取流的方式行不通,由于没法直接读取压缩包中的文件,读取只能经过流的方式读取。
前三种均可以读取到其实异曲同工,直接查看底层代码都是经过类加载器读取文件流,类加载器能够读取jar包中的编译后的class文件,固然也是能够读取jar包中的文件流了。
用解压软件打开jar包查看结果以下:springboot
其中cst文件中是编译后class文件存放位置,excleTemplate是模板存放位置,类加载器读取的是cst下class文件,一样能够读取excleTemplate下的模板的文件流了。测试