需求说明
代码中需要读取resource目录下的文件。
解决方案
方案1
ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx");
InputStream inputStream = classPathResource.getInputStream();
方案2
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");
方案3
InputStream inputStream = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");
方案4
File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);
前三种方法在开发环境(IDE中)和生产环境(linux部署成jar包)都可以读取到,第四种只有开发环境 时可以读取到,生产环境读取失败。
推测主要原因是springboot内置tomcat,打包后是一个jar包,无法直接读取jar包中的文件,读取只能通过类加载器读取。
前三种都可以读取到其实殊途同归,直接查看底层代码都是通过类加载器读取文件流,类加载器可以读取jar包中的编译后的class文件,当然也是可以读取jar包中的excle模板了。
需要注意的点
项目所在的绝对路径中最好不要有中文,否则会显示找不到文件。
我就遇到了这种情况。
上述都是获得输入流,如果需要读取文本,借助InputStreamReader即可读取到文本。
参考链接
https://blog.csdn.net/qq_43684985/article/details/115341746
https://blog.csdn.net/gaoyang8320/article/details/89672088