2013-10-24 47 views
5

我很困惑getResourceAsStream();getResourceAsStream(文件)在哪裏搜索文件?

我的包結構如下:

​​

而且我想從floodlightdefault.properties閱讀。這裏是我的代碼,趴在net.floodlightcontroller包:

package net.floodlightcontroller.core.module; 
// ... 
InputStream is = this.getClass().getClassLoader() 
       .getResourceAsStream("floodlightdefault.properties"); 

但它失敗了,越來越is == null。所以我想知道getResourceAsStream(file)如何搜索file。我的意思是它通過某些PATH s或在某個訂單

如果是這樣,如何配置getResourceAsStream()尋找的地方?

Thx!

+0

您是否已將資源目錄在運行你的代碼時在類路徑中?一般來說,getResourceAsStream的行爲取決於ClassLoader的實現。 –

+0

一般來說,它也將取決於「this」是指什麼。 – Radiodef

+0

要解決您的空問題,我最初看到兩件事情。首先,它看起來像你只需要將你的目錄改爲'「resources/floodlightdefault.properties」'。其次,該方法可能會查找構建目錄中的資源,並且您顯示的目錄結構看起來是IDE項目的源文件夾。儘管當然如果您已經將資源添加到項目中,IDE應該自動將文件複製到構建目錄。在使用Netbeans進行快速測試時,如果從_both_ build和src文件夾中刪除它們,我的資源只會出現空白。 – Radiodef

回答

7

當您調用this.getClass().getClassLoader().getResourceAsStream(File)時,Java將在與this指示的類相同的目錄中查找該文件。所以,如果你的文件結構是:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

然後你要撥打:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("..\..\..\resources\floodlightdefault.properties"); 

更重要的是,改變你的包結構的樣子:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
    |__ floodlightdefault.properties //target 
    |__ ... 

並調用電話:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("floodlightdefault.properties"); 
+0

@Jones謝謝,我添加了「資源」到課程路徑,它也可以。 – qweruiop