Java项目打包后获取classes路径下的资源文件

在resources路径下放置的资源文件,例如/file/example.txt文件,在IDE中直接运行时,是可以通过以下两种方式获取文件流的:

方式1:(name不能以"/"左斜线开始,否则会认为是从根目录开始读取,抛出空指针异常)

InputStream fis = this.getClass().getClassLoader().getResourceAsStream("file/example.txt");

方式2:(需要以"/"开始,读取的是相对于classthpasth的绝对路径)

InputStream fis = this.getClass().getResourceAsStream("/file/example.txt");

但是以上两种方式在打包后可能都获取不到example.txt,解决方案如下:(路径不能以"/"开始)

InputStream fis = Thread.currentThread().getContextClassLoader().getResourceAsStream("file/example.txt");

原因分析:

this.getClass().getClassLoader()的ClassLoader为AppClassLoader,而Thread.currentThread().getContextClassLoader()的ClassLoader为AppClassLoader为TomcatEbeddedWebAppClassLoader。
相关说法是:
将WEB程序发布到Tomcat里面运行。首先执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader()。而后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。如果使Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致。

Java项目打包后获取classes路径下的资源文件_第1张图片Java项目打包后获取classes路径下的资源文件_第2张图片

你可能感兴趣的:(Java笔记)