0

JavaDoc 的Class#getResourceAsStream(String)内容如下:

查找具有给定名称的资源。搜索与给定类关联的资源的规则由该类的定义类加载器实现。这个方法委托给这个对象的类加载器。

那么以下如何工作:

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无法理解为什么类加载器可以找到资源?

4

3 回答 3

1

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

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

于 2012-09-21T07:42:03.300 回答
1

检查一下InputStream is = App.class.getResourceAsStream("test.properties");

Class.getResourceAsStream 和 ClassLoader.getResourceAsStream 之间有区别

于 2012-09-21T07:35:25.377 回答
0

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

于 2012-09-21T07:31:51.243 回答