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");