web-dev-qa-db-ja.com

クラスパスリソース(XMLファイル)から入力ストリームを取得する

Java Webアプリケーションで、CLASSPATH(sourcesフォルダー内)に配置されているXMLファイルのInputStreamを取得する場合、どうすればよいですか?

77
Veera

ClassLoader.getResourceAsStream()

以下のコメントで述べられているように、マルチClassLoader環境(ユニットテスト、webappsなど)にいる場合は、Thread.currentThread().getContextClassLoader()を使用する必要があります。 http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 を参照してください。

93
cletus
ClassLoader.class.getResourceAsStream("/path/file.ext");
30
jkarretero

これは、XMLファイルがどこにあるかによって異なります。ソースフォルダー(「デフォルトパッケージ」または「ルート」)にあるのですか、それともクラスと同じフォルダーにあるのですか?

前者の場合、「/file.xml」(先頭のスラッシュに注意)を使用してファイルを検索する必要があります。ファイルを見つけるために使用するクラスは関係ありません。

XMLファイルが何らかのクラスの隣にある場合、ファイル名のみを含むSomeClass.class.getResourceAsStream()が道です。

12
Aaron Digulla

ClassLoader.class.getResourceAsStream("/path/to/your/xml")そして、コンパイルスクリプトがxmlファイルをCLASSPATHの場所にコピーしていることを確認します。

11
Clint

someClassWithinYourSourceDir.getClass()。getResourceAsStream();

6
mP.

この回答の「getResourceAsStream()」オプションのいくつかは機能しませんでしたが、これは機能しました:

SomeClassWithinYourSourceDir.class.getClassLoader()。getResourceAsStream( "yourResource");

4
user64141

提案された解決策を試してみましたが、ファイル名のスラッシュは機能しませんでした。例:...()。getResourceAsStream( "/ my.properties"); nullが返されました

スラッシュの削除は機能しました:.... getResourceAsStream( "my.properties");

これはdoc APIからのものです。委任前に、このアルゴリズムを使用して、指定されたリソース名から絶対リソース名が構築されます。

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'). 
0
Striker