Class.getResource和ClassLoader.getResource的区别

287 阅读1分钟

Class.getResource(String path)

System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));

输出结果如下:

file:/D:/Projects/IdeaProjects/javaweb/target/classes/com/xgc/test/
file:/D:/Projects/IdeaProjects/javaweb/target/classes/

分析:

  1. Class.getResource("") 是从当前类所在包路径去获取资源

  2. Class.getResource("/") 是从classpath的根路径获取

现在来获取resources下的文件2.txt3.txt

System.out.println(Test.class.getResource("/3.txt"));
System.out.println(Test.class.getResource("/test/2.txt"));

输出结果如下:

file:/D:/Projects/IdeaProjects/javaweb/target/classes/3.txt
file:/D:/Projects/IdeaProjects/javaweb/target/classes/test/2.txt

ClassLoader.getResource

 System.out.println(Test.class.getClassLoader().getResource(""));
 System.out.println(Test.class.getClassLoader().getResource("/"));

输出结果如下

file:/D:/Projects/IdeaProjects/javaweb/target/classes/
null

分析:

  1. ClassLoader.getResource("")是从classpath的根路径获取

  2. ClassLoader.getResource("/"),说明路径中无法带有"/"

现在来获取resources下的文件2.txt3.txt

System.out.println(Test.class.getClassLoader().getResource("3.txt"));
System.out.println(Test.class.getClassLoader().getResource("test/2.txt"));

输出结果如下

file:/D:/Projects/IdeaProjects/javaweb/target/classes/3.txt
file:/D:/Projects/IdeaProjects/javaweb/target/classes/test/2.txt

总结

  1. Class.getResource("/")ClassLoader.getResource都是从classpath的根路径开始获取

  2. Class.getResource("") 获取的是当前类所在的包路径

  3. ClassLoader.getResource() 不允许存在"/"

这里获取到的其实只是资源的URL。想要对资源进行操作,还需要进行一些其他的操作。

其实,不管是Class还是ClassLoader都存在一个getResourceAsStream()方法,通过这个方法我们可以直接对资源进行处理。这个方法对资源路径的处理和getResource()方法一样。

参考文章

读取resources资源-class.getResource、ClassLoader.getResource和getResourceAsStream的区别