问题 有和没有getClassLoader的getResourceAsStream有什么区别?


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

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

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

谢谢。


3534
2017-09-06 04:19


起源



答案:


来自Javadoc for Class.getResourceAsStream()

此方法委托给该对象的类加载器。   在委派之前,使用此算法从给定资源名称构造绝对资源名称:

  • 如果 name 以'/'('\ u002f')开头,然后资源的绝对名称是'/'后面的名称部分。
  • 否则,绝对名称具有以下形式:    modified_package_name/name
      其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。

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

总之,第一次提取 path/to/my/properties 和第二次提取 package/of/myclass/path/to/my/properties


11
2017-09-06 04:22





来自 Class.getClassLoader()  文件

返回类的类加载器。一些实现可能会使用   null表示引导类加载器。这个方法会返回   如果此类由引导程序加载,则在此类实现中为null   类加载器。

所以 getClassLoader()  可能 返回 null 如果类是由引导类加载器加载的,那么在null中检查 Class.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在其中解释过 他的回答


2
2017-09-06 04:27





主要的实际区别在于,您可以在课程中使用相对路径。因此,如果您的属性与MyClass位于同一个包中,则可以执行此操作

MyClass.class.getResourceAsStream("properties");

1
2017-09-06 04:31