我想知道以下兩者的區別:getResourceAsStream和不帶getClassLoader的區別是什麼?
MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");
和
MyClass.class.getResourceAsStream("path/to/my/properties");
謝謝。
我想知道以下兩者的區別:getResourceAsStream和不帶getClassLoader的區別是什麼?
MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");
和
MyClass.class.getResourceAsStream("path/to/my/properties");
謝謝。
從Javadoc文檔Class.getResourceAsStream()
:
此方法委託給該對象的類加載器。
- 如果
name
以「/」(「\ u002f」),那麼資源的絕對名稱是: 代表團之前,絕對的資源名稱是從給定的資源名稱中使用這種算法構建'/'後面的部分名稱。- 否則,絕對名稱的格式如下:
modified_package_name/name
其中,modified_package_name是此對象的包名,'/'替代'。'。 ( '\ u002e')。
換句話說,他們做同樣的事情,如果「路徑」與「/」開頭,但如果沒有,那麼在後一種情況下,路徑將是相對於類的包,而類加載器將是絕對的。
總之,第一次取path/to/my/properties
和第二次取package/of/myclass/path/to/my/properties
。
從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);
}
您還會注意到聲明name = resolveName(name);
其中馬克彼得斯在his answer中解釋過。
主要的實際區別在於,您可以在通過課程時使用相對路徑。因此,如果您的房產與MyClass在同一包裹中,您可以做
MyClass.class.getResourceAsStream("properties");