2017-07-04 18 views
2

の検索パスの文字列にFile.separatorを使用すると、Javaがリソースを見つけられない理由を説明できますか?私はこのコードを持っている:Java - リソースをgetResourceAsStream(String)で読み取る

private final String RESOURCE_PATH = File.separator + "dir" + File.separator; 
private final String SAME_PATH_HARDCODED = "/dir/"; 

public void findResource(String fileName) { 
    InputStream file1 = ThisClass.class 
      .getResourceAsStream(RESOURCE_PATH + fileName); // returns null 

    InputStream file2 = ThisClass.class 
      .getResourceAsStream(SAME_PATH_HARDCODED + fileName); // returns file 
} 

私はFile.separatorの代わりにスラッシュバックスラッシュを使用していること、を見出しました。しかし、私はFile.separatorがより柔軟であることを望んだ。この場合、それはisntです。そして私は知りたいのですが、なぜですか。どうもありがとう。

+0

私は同じことを試みましたが、私は何の例外もありませんでした。 –

+1

このメソッドは、見つからない場合はnullを返すため、例外はありません。 – LeckerMaedschen

答えて

0

セパレータgetResourceAsStream()\\メソッドを渡すと、別の方法であなたのdirへのパスが解釈され、実際にdirの前にパッケージ名が追加されるためです。

Class javadoc

を委任する前に、絶対リソース名は、このアルゴリズムを使用して 与えられたリソース名から構成されています

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'. 
Otherwise, the absolute name is of the following form: 

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 

あなたFile.separator戻っ異なる結果UNIXとWindowsマシン用。この場合、mackまたはunixを使用するとコードは動作しますが、winマシンは失敗します。

File javadoc

のpublic static final文字separatorCharです

システムに依存するデフォルトの名前区切り文字。このフィールドは で、 プロパティfile.separatorの値の最初の文字を含むように初期化されています。 UNIXシステムでは、このフィールドの値は '/'です。 Microsoft Windowsシステムでは '\'です。

関連する問題