getResource()方法的使用以及路径问题

getResource()方法是Class类中的一个获取文件的方法,我在使用该方法稍微不注意经常会出现如下报错

Exception in thread "main" java.lang.NullPointerException

 因此我觉得还是有必要写一篇博客来梳理以下该方法的误区、盲点。


首先getResource()方法可以通过getClass().getClassLoader().getResource()和getClass().getResource()两种方式调用,这两种方式调用的区别在于

getClass().getClassLoader().getResource():这个方法是通过类加载器来加载资源的。它从类路径的根目录开始搜索资源。 返回的 URL 是绝对路径,不受调用类的包所影响。

getClass().getResource():这个方法是通过当前类的 class 文件所在的位置作为相对路径来搜索资源的。 返回的 URL 是相对路径,受调用类的包的影响。

总结来说就是

  • getClass().getResource(fileName):表示只会在当前调用类所在的同一路径下查找该fileName文件;
  • getClass().getClassLoader().getResource(fileName):表示只会在classpath根目录下(/)查找该文件;
  • fileName如果是前面加“/”,如"/fileName",则表示绝对路径,取/目录下的该文件;
  • 如果是前面没有加“/”,如"fileName",则表示相对路径,取与调用类同一路径下的该文件。
  • getClassLoader()表示/目录,即classpath根目录

比如说在com/***/A包下存在一个文本文件,那么在同一文件夹下的类获取该资源的方法如下

clazz.getClass().getResource("1.text");//相对路径获取
clazz.getClass().getResource("/com/***/A/1.text");//绝对路径获取
clazz.getClass().getClassLoader().getResource("com/***/A/1.text");//com前不需要加“/”

 而不同包的类获取该资源,比如说com/***/B包下的类获取,则需要填写如下获取路径

clazz.getClass().getResources("../A/1.text");
clazz.getClass().getResources("/com/***/A/1.text");
clazz.getClass().getClassLoader().getResources("com/***/A/1.text");

你可能感兴趣的:(java)