样例
/**
* 测试通过三种方式加载文件
*
* @author chaozai
* @date 2019年9月23日
*
*/
public class ResourceLoaderTest {
private static final String TEST_FILE_PATH_FOR_CLASS_1 = "test.txt";
private static final String TEST_FILE_PATH_FOR_CLASS_2 = "/resource/test.txt";
private static final String TEST_FILE_PATH_FOR_CLASSLOADER = "resource/test.txt";
public static void main(String[] args) {
//class.getResource:不以/开头,相对于当前class文件所在路径查找
System.out.println(ResourceLoaderTest.class.getResource(TEST_FILE_PATH_FOR_CLASS_1));
//class.getResource:以/开头,则相对于跟路径查找
System.out.println(ResourceLoaderTest.class.getResource(TEST_FILE_PATH_FOR_CLASS_2));
//classLoader.getResource:不以/开头,相对于跟路径查找
System.out.println(ResourceLoaderTest.class.getClassLoader().getResource(TEST_FILE_PATH_FOR_CLASSLOADER));
//ClassLoader.getSystemClassLoader().getResource:同classLoader
System.out.println(ClassLoader.getSystemClassLoader().getResource(TEST_FILE_PATH_FOR_CLASSLOADER));
//错误样例
System.out.println(ResourceLoaderTest.class.getResource(TEST_FILE_PATH_FOR_CLASSLOADER));
System.out.println(ResourceLoaderTest.class.getClassLoader().getResource(TEST_FILE_PATH_FOR_CLASS_2));
System.out.println(ClassLoader.getSystemClassLoader().getResource(TEST_FILE_PATH_FOR_CLASS_2));
}
}
结果:
file:/D:/workspace/java/studyworkspace/JavaTest/bin/resource/test.txt
file:/D:/workspace/java/studyworkspace/JavaTest/bin/resource/test.txt
file:/D:/workspace/java/studyworkspace/JavaTest/bin/resource/test.txt
file:/D:/workspace/java/studyworkspace/JavaTest/bin/resource/test.txt
null
null
null
结论:
- class的getResource不以/开头,会从class这个类所在的目录开始搜索资源,如果以/开头,会从工程的根目录开始搜索
- classloader的getResource不以/开头,会从工程的根目录开始搜索资源
- classLoader的getSystemResource方法与classloader的getResource相同,当无法获取线程上下文,且类的父加载器是Bootstrap加载器时,可以选择这种方式
爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!