Class如何查找资源?

时间:2012-09-21 07:28:23

标签: java classloader

Class#getResourceAsStream(String)的JavaDoc读取:

  

查找具有给定名称的资源。搜索资源的规则   与给定类相关联的是由定义类实现的   班级装载机。此方法委托给此对象的类   加载器。

那么以下工作如何:

class AppTest {
private static final Properties p = new Properties();    
    static {        
        try {
            p.load(AppTest.class.getResourceAsStream(("config.properties")));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
...
}

如果config.properties与AppTest.class位于同一目录中:

pro/wulfgar/net/on/users/app/{AppTest.class,config.properties} 

AppTest.class的类加载器不应该在应用程序类路径(在这种情况下为.)中查找它吗?因此,config.properties应与 pro 目录处于同一级别。

即使我将资源定义为pro/wulfgar/net/on/users/app/config.properties,我无法理解为什么类加载器可以找到资源?

3 个答案:

答案 0 :(得分:1)

查看InputStream is = App.class.getResourceAsStream("test.properties");

Class.getResourceAsStream和ClassLoader.getResourceAsStream之间存在差异

答案 1 :(得分:1)

JavaDoc上的措辞可能会使您感到困惑。 Class.getResourceAsStream(String)将解析类引用包中的资源(pro / wulfgar / net / on / users / app / config.properties)。如果您不希望以这种方式解析它,则在资源名称的开头添加“/”以表示它位于基本级别(如果您遵循标准包约定,则为pro / wulfgar / config.properties )。

JavaDoc的后半部分概述了此行为。 JavaDoc的引用部分解释了它委托给该类的ClassLoader。由于每个ClassLoader都有一个单独的文件源(jar或文件系统),因此它区分了特定的ClassLoader的资源集。

答案 2 :(得分:0)

由于包名称,ClassLoader已经知道AppTest.class所在的目录。它没有属性文件的此类信息。