【Java】文件资源加载

样例

/**
 * 测试通过三种方式加载文件
 * 
 * @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加载器时,可以选择这种方式

爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!

发布了96 篇原创文章 · 获赞 237 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qqchaozai/article/details/101217131