我想知道以下两点之间的区别:
MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");
和
MyClass.class.getResourceAsStream("path/to/my/properties");
谢谢。
答案 0 :(得分:12)
来自Class.getResourceAsStream()
的Javadoc:
此方法委托此对象的类加载器。 在委派之前,使用此算法从给定的资源名称构造绝对资源名称:
- 如果
name
以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。- 否则,绝对名称的格式如下:
modified_package_name/name
其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。
换句话说,如果“path”以“/”开头,它们会做同样的事情,但如果没有,那么在后一种情况下,路径将相对于类的包,而类加载器将是绝对的。
简而言之,第一次提取path/to/my/properties
,第二次提取package/of/myclass/path/to/my/properties
。
答案 1 :(得分:2)
来自Class.getClassLoader()
documentation:
返回类的类加载器。一些实现可能会使用 null表示引导类加载器。这个方法会返回 如果此类由引导程序加载,则在此类实现中为null 类加载器。
如果类由引导类加载器加载,getClassLoader()
可能返回null
,因此Class.getResourceAsStream
implementation中的空检查:
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);
}
您还会注意到Mark Peters在his answer中解释过的name = resolveName(name);
声明。
答案 2 :(得分:1)
主要的实际区别在于,您可以在课程中使用相对路径。因此,如果您的属性与MyClass位于同一个包中,则可以执行
MyClass.class.getResourceAsStream("properties");