12

我想知道以下两者之间的区别:

MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");

MyClass.class.getResourceAsStream("path/to/my/properties");

谢谢你。

4

3 回答 3

13

来自 Javadoc 的Class.getResourceAsStream()

这个方法委托给这个对象的类加载器。在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:

  • 如果name以“/”开头(“\u002f”),则资源的绝对名称是“/”后面的名称部分。
  • 否则,绝对名称采用以下形式: modified_package_name/name
    其中 modified_pa​​ckage_name 是此对象的包名称,用 '/' 代替了 '.' ('\u002e')。

换句话说,如果“路径”以“/”开头,它们会做同样的事情,但如果不是,那么在后一种情况下,路径将相对于类的包,而类加载器将是绝对的。

简而言之,第一个 fetchespath/to/my/properties和第二个 fetches package/of/myclass/path/to/my/properties

于 2012-09-06T04:22:24.863 回答
4

Class.getClassLoader() 文档中:

返回类的类加载器。一些实现可能使用 null 来表示引导类加载器。如果此类由引导类加载器加载,则此方法将在此类实现中返回 null。

如果类是由引导类加载器加载的,那么getClassLoader() 可能会返回,因此实现中的 null 检查:nullClass.getResourceAsStream

public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
}

您还会注意到name = resolveName(name);Mark Peters 在他的回答中解释的陈述。

于 2012-09-06T04:27:35.973 回答
2

主要的实际区别是您可以在上课时使用相对路径。因此,如果您的属性与 MyClass 在同一个包中,您可以这样做

MyClass.class.getResourceAsStream("properties");
于 2012-09-06T04:31:09.200 回答