开始前先贴一下项目结构
1 public class TestLocation { 2 @Test 3 public void test1(){ 4 String s1 = Objects.requireNonNull(TestLocation.class.getResource("")).toString();//------------------① 5 out.println(s1); 6 String s2 = Objects.requireNonNull(TestLocation.class.getResource("/")).toString(); 7 out.println(s2); 8 } 9 }
从这里可以看出区别
TestLocation.class.getResource("")
TestLocation.class.getResource("/")
classes是编译后的文件夹,
getResource中啥也不写,就是从当前类编译后所在的目录查找
getResource中写 / ,就是从编译后文件夹的根目录查找
现在我们做个测试,查找test目录下编译后的文件
结果和我预想的一样。
1 @Test 2 public void test2(){ 3 String s1 = Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource("")).toString(); 4 out.println(s1); 5 }
可以看出这个结果和①处相同。
再来做个测试
两张图的区别在于
后者我再getRes的时候加上了包名前缀!
正如我注释中写的, 类.class.getRes只在类所在的目录中查找资源文件,即使加上了包名前缀也没效果。
那么下一个问题,
Thread.currentThread().getContextClassLoader().getResource()是如何查找文件的?---------------------------未完待续