1. 开发环境读取
1.1 本地读取资源文件
(不建议使用绝对路径(d:/xxx/xxx.xml)和相对路径(src/java/main/xxx.xml读取)。
相对路径:采用文件(File)方式进行读取:
File file = new File("src/main/resources/xxx/xxx.properties");
InputStream in = new FileInputStream(file);
当在eclipse中运行(不部署到服务器上),可以读取到文件。
1.2 本地ide读取文件
File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);
这种方式只有开发环境 时可以读取到,生产环境读取失败。springboot内置tomcat,打包后是一个jar包,无法直接读取jar包中的文件,读取只能通过类加载器读取。
2. 生产环境(linux部署成jar包)
当工程部署到Tomcat中时,按照上边方式,则会出现找不到该文件路径的异常。经搜索资料知道,Java工程打包部署到Tomcat中时,properties的路径变到顶层(classes下):
并且,此时读取文件需要采用 流(stream) 的方式读取,如下:
第一种:
InputStream in = this.getClass().getResourceAsStream("/xxx/basecom.properties");
其中properties前的斜杠,相对于调用类,共同的顶层路径。
第二种
ClassPathResource classPathResource = new ClassPathResource("xxx/test.xlsx");
InputStream inputStream =classPathResource.getInputStream();
第三种
对于多线程写法,要用下面的线程上下文的方式读取
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("haha.txt");
这三种都可以读取到文件原来其实殊途同归,直接查看底层代码都是通过类加载器读取文件流,类加载器可以读取jar包中的编译后的class文件,当然也是可以读取jar包中的excle模板了。