Class.getResource()与ClassLoader.getResource()的区别
Class.getResource()
是指AAA.class.getResource()
-
Class.getResource(String name):在当前class类的同一路径下查找资源
-
ClassLoader.getResource(String name):在根目录下查找该资源文件,即"/"或classpath目录
粗解
-
在当前项目目录下查找指定的文件,此方式只能加载当前项目classpath下的文件,用.表示当前目录,不能以/开头,会报错
1
2
3
4// 方式1
URL url = ClassLoader.getSystemResource(".");
// 方式2
url = LoaderResourceTest.class.getClassLoader().getResource(".");url会输出当前class文件所在的根目录,比如当前我输出的结果就是
file:/Users/chuan/Documents/projects_code/java-project/demo/demo-core/target/classes/
-
以当前类所在的目录为基础,在当前目录查找并加载指定名称的资源文件,比如当前类LoaderResourceTest在项目的
cc.kevinlu.demo.core.loader
包中,若是我们以LoaderResourceTest.class.getResource("LoaderT.class")
的方式加载一个文件,则首先会在cc.kevinlu.demo.core.loader
包中查找LoaderT.class文件,若查找不到则返回null,如果我们想要加载其他包中的文件,则可以使用"/"开头并加上文件在项目中的完整包路径,比如LoaderResourceTest.class.getResource("/cc/kevinlu/demo/core/gof/facade/FacadeTest.class")
1
2
3
4
5// 获取当前类所在的包目录
url = LoaderResourceTest.class.getResource(".");
// 获取其他包内的文件
url = LoaderResourceTest.class.getResource("/cc/kevinlu/demo/core/gof/facade/FacadeTest.class");这两条语句的输出:
1
2
3file:/Users/chuan/Documents/projects_code/java-project/demo/demo-core/target/classes/cc/kevinlu/demo/core/loader/
file:/Users/chuan/Documents/projects_code/java-project/demo/demo-core/target/classes/cc/kevinlu/demo/core/gof/facade/FacadeTest.class由此可以很明显的看出Class的getResource是获取当前类所在的包目录,如果不同的包中都有相同名称的资源文件,但是仅针对当前包可用,那么就可以使用这种方式去加载读取,不会出现读到其他目录的文件的情况,但是这仅受限于我们写的类,不适用于jar包中的。
-
如果我们想读取项目中引用的jar包内的文件,那么怎么办?其实和读取项目中自己写的文件是相同的办法,因为在系统启动的时候会将jar包中的文件加载到classpath目录下,所以读取方式一样的。
-
以上讲解的只是读取单个资源,那么要是想把所有匹配到的资源都获取到,则可以使用
Class.getClassLoader().getResources()
和ClassLoader.getSystemResources()
两种方式1
2
3
4
5
6
7
8
9
10Enumeration<URL> urls = LoaderResourceTest.class.getClassLoader().getResources("META-INF/spring.factories");
while (urls.hasMoreElements()) {
System.out.println(urls.nextElement());
}
System.out.println("--ClassLoader.getSystemResources--");
urls = ClassLoader.getSystemResources("META-INF/spring.factories");
while (urls.hasMoreElements()) {
System.out.println(urls.nextElement());
} -
读取资源文件内容方式
1
2
3
4
5
6InputStream is = LoaderResourceTest.class.getClassLoader().getResourceAsStream("META-INF/spring.factories");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
整个测试文件代码
1 | package cc.kevinlu.demo.core.loader; |