2013-10-24 3 views
5

私はgetResourceAsStream()によって混乱してしまいました。getResourceAsStream(file)はファイルをどこから検索しますか?

私のパッケージ構造は次のようになります。

​​

そして私はfloodlightdefault.propertiesから読みたいです。ここに私のコードはnet.floodlightcontrollerパッケージに横たわって、次のとおりです。

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

しかし、それはis == nullを取得し、失敗しました。だから私はどのくらい正確にgetResourceAsStream(file)fileを検索するのだろうかと思っています。私はそれが特定のPATHまたは特定のの注文を介して動作するのですか?

もしそうなら、getResourceAsStream()が探している場所をどのように設定するのですか?

Thx!

+0

リソースディレクトリを追加しましたかあなたのコードを実行しているクラスパスで?一般に、getResourceAsStreamの動作はClassLoaderの実装によって異なります。 –

+0

一般的に言えば、それは「これ」が何を指しているかにも依存するでしょう。 – Radiodef

+0

ヌル問題を修正するには、最初は2つのことがあります。まず、ディレクトリを '' resources/floodlightdefault.properties ''に変更するだけです。次に、メソッドはビルドディレクトリ内のリソースを探している可能性があり、表示されたディレクトリ構造はIDEプロジェクトのソースフォルダのようです。もちろん、プロジェクトにリソースを追加した場合、IDEはビルドディレクトリにファイルを自動的にコピーする必要があります。 Netbeansを使った簡単なテストでは、ビルドとsrcフォルダの両方からそれらを削除すると、私のリソースはnullになります。 – Radiodef

答えて

7

this.getClass().getClassLoader().getResourceAsStream(File)を呼び出すと、Javaはthisで示されるクラスと同じディレクトリにあるファイルを探します。だからあなたのファイル構造がある場合:

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

次に呼び出したいでしょう:

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

そして、ちょうどコール:見えるようにあなたのパッケージ構造を変更、

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

をいっそ電話:

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

@Jonesありがとう、クラスパスに 'resources'を追加しました。 – qweruiop

関連する問題