2012-09-06 22 views

回答

11

從Javadoc文檔Class.getResourceAsStream()

此方法委託給該對象的類加載器。

  • 如果name以「/」(「\ u002f」),那麼資源的絕對名稱是: 代表團之前,絕對的資源名稱是從給定的資源名稱中使用這種算法構建'/'後面的部分名稱。
  • 否則,絕對名稱的格式如下: modified_package_name/name
    其中,modified_pa​​ckage_name是此對象的包名,'/'替代'。'。 ( '\ u002e')。

換句話說,他們做同樣的事情,如果「路徑」與「/」開頭,但如果沒有,那麼在後一種情況下,路徑將是相對於類的包,而類加載器將是絕對的。

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

2

Class.getClassLoader()documentation

返回該類的類加載器。一些實現可能使用 null來表示引導類加載器。如果此類由引導程序 類加載器加載,則此方法將在此類實現中返回 null。

所以getClassLoader()可能返回null如果該類被引導類加載器,因此在Class.getResourceAsStreamimplementation空校驗裝:

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中解釋過。

1

主要的實際區別在於,您可以在通過課程時使用相對路徑。因此,如果您的房產與MyClass在同一包裹中,您可以做

MyClass.class.getResourceAsStream("properties"); 
相關問題