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


81

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

回答:


99

ClassLoader.getResourceAsStream()

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


コード例については、個人の記事を参照してください。tshikatshikaaa.blogspot.nl/2012/07/...
ジェローム・Verstrynge

14
マルチクラスローダー環境(単体テスト/ Webアプリなど)を使用している場合は、このThread.currentThread()。getContextClassLoader()を使用する必要がある場合があります。stackoverflow.com/questions/2308188/を

@khyloの提案をあなたの答えに追加してください!
froginvasion 2015年

8
別の方法:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei 2018年

1
@zhuguoweiClassPathResourceはSpringクラスです。
ichalos 2018

31
ClassLoader.class.getResourceAsStream("/path/file.ext");

しかし、この方法でWebアプリをTomcatにデプロイするjava.lang.NullPointerException: null と、エラーが発生します。、そして私が考える最も簡単な方法はnew ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei 2018年

戦争で利用できるようにする方法を教えてください
VikramSaini18年

デプロイしたときに同じ問題が発生しました。誰かがこの状況の解決策を見つけることができますか?
オーガスト

12

これは、XMLファイルが正確にどこにあるかによって異なります。それはsourcesフォルダー(「defaultpackage」または「root」内)にありますか、それともクラスと同じフォルダーにありますか?

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

XMLファイルがクラスの隣にある場合はSomeClass.class.getResourceAsStream()、ファイル名だけが最適です。


11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") コンパイルスクリプトがxmlファイルをCLASSPATHのどこにコピーしているのかを確認してください。


6

someClassWithinYourSourceDir.getClass()。getResourceAsStream();


またはgetClass().getResourceAsStream("...")など
rogerdpack 2016

4

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

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


0

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

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

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

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

私の場合、私はnull なしで取得していまし/。スラッシュ文字を追加するとうまくいきました。@ hussein-terekと私のセットアップおよびあなたのセットアップの間には他の違いがあるはずです。
AjoyBhatia18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.