web-dev-qa-db-ja.com

getResourceAsStream()は常にnullを返します

Java Webアプリケーションに次の構造があります。

TheProject
  -- [Web Pages]
  -- -- [WEB-INF]
  -- -- -- abc.txt
  -- -- index.jsp
  -- [Source Packages]
  -- -- [wservices]
  -- -- -- WS.Java

WS.Java、Webメソッドで次のコードを使用しています。

InputStream fstream = this.getClass().getResourceAsStream("abc.txt");

ただし、常にnullを返します。そのファイルから読み取る必要があります。ファイルをWEB-INFgetResourceAsStreamでアクセスできますが、メソッドは常にnullを返します。

私が間違っている可能性のあるアイデアはありますか?

ところで、奇妙なことに、これは機能していましたが、Clean and Buildプロジェクトで、突然動作しなくなりました:/

45
Andreas Grech

私の知る限り、ファイルは'this'クラスが存在するフォルダー内、つまりWEB-INF/classes内ではなく、さらに深くネストされている必要があります(デフォルトパッケージに記述しない限り)。

net/domain/pkg1/MyClass.Java  
net/domain/pkg1/abc.txt

ファイルをJavaソースに入れると動作するはずです。コンパイラはそのファイルをクラスファイルと一緒にコピーします。

40

Class#getResourceAsStream(String) への呼び出しはクラスローダーに委任し、リソースはクラスパスで検索されます。つまり、現在のコードは機能しないため、_abc.txt_を_WEB-INF/classes_に入れるか、jarファイルにパッケージ化されている場合は_WEB-INF/lib_に入れる必要があります。

Oruse ServletContext.getResourceAsStream(String) whichサーブレットコンテナがリソースを利用可能にするクラスローダーを使用せずに、任意の場所からサーブレットに。そのため、これをサーブレットから使用します。

_this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ;
_

しかし、WebサービスからgetServletContextを呼び出す方法はありますか?

JAX-WSを使用している場合、WebServiceContextを注入できます:

_@Resource
private WebServiceContext wsContext;
_

そして、それからServletContextを取得します:

_ServletContext sContext= wsContext.getMessageContext()
                             .get(MessageContext.SERVLET_CONTEXT));
_
29
Pascal Thivent

の代わりに

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

つかいます

InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");

このようにして、現在の呼び出しクラスのパスからではなく、ルートから見えるようになります

19
Mike-Bell

この方法で「どこからでも」(サーバーの場所を含む)ファイルを取得でき、どこに置くかを気にする必要はないと思います。

通常、そのようなことを気にすることは悪い習慣です。

Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
7
jediz

これがJAX-WSに当てはまるかどうかはわかりませんが、JAX-RSの場合、ServletContextを挿入してからgetResourceAsStream()を呼び出すことでファイルにアクセスできました。

@Context ServletContext servletContext;
...
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");

少なくともGlassFish 3.1では、パスは絶対パスである必要がありました。つまり、スラッシュで始まることに注意してください。詳細: jax-rsでプロパティファイルを使用する方法

5
Matthew Cornell

Websphere 8.5からWebSphere Libertyに変更したときにも同じ問題が発生しました。

何らかの理由でWebSphere Libertyが_WEB-INF_フォルダー内のファイルを見つけられないため、getResourceAsStream()の代わりにFileInputStreamを使用しました。

スクリプトは次のとおりです。

_FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") 
                        + "\WEBINF\properties\myProperties.properties")
_

注:このスクリプトは開発用にのみ使用しました。

1
Ciro Hidalgo

同様の問題があり、かなり長い間解決策を探しました。文字列パラメーターは大文字と小文字が区別されるようです。したがって、ファイル名がabc.TXTで、abc.txtを検索すると、Eclipseはそれを見つけます-実行可能JARファイルはそれを見つけません。

1
Dominik Maresch