[解決済み】InputStreamとしてファイルを読み込むさまざまな方法
質問
の違いは何ですか?
InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)
そして
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
そして
InputStream is = this.getClass().getResourceAsStream(fileName)
それぞれどんな時に使うのが適切なのでしょうか?
読みたいファイルが、ファイルを読み込むクラスと同じクラスパスにあります。 私のクラスとファイルは同じjarにあり、EARファイルにパッケージされ、WebSphere 6.1にデプロイされています。
解決方法は?
をどのように使用するかについては、微妙な違いがあります。
fileName
を渡すと、それが解釈されます。基本的には、2種類のメソッドがあります。
ClassLoader.getResourceAsStream()
と
Class.getResourceAsStream()
. この2つの方法は、リソースの位置が異なります。
で
Class.getResourceAsStream(path)
の場合、パスは呼び出し元のクラスのパッケージのローカルなパスとして解釈されます。例えば呼び出し。
String.class.getResourceAsStream("myfile.txt")
は、クラスパスの中で次の場所にあるファイルを探します。
"java/lang/myfile.txt"
. パスの先頭が
/
の場合、絶対パスとみなされ、クラスパスのルートから検索が開始されます。そのため
String.class.getResourceAsStream("/myfile.txt")
は、クラスパスの中で次の場所を探します。
./myfile.txt
.
ClassLoader.getResourceAsStream(path)
は、すべてのパスを絶対パスとみなします。そのため
String.class.getClassLoader().getResourceAsStream("myfile.txt")
と
String.class.getClassLoader().getResourceAsStream("/myfile.txt")
は、どちらもクラスパスの中で次の場所にあるファイルを探します。
./myfile.txt
.
この投稿で場所について言及するときはいつも、リソースをロードするクラスやClassLoaderに応じて、ファイルシステム自体または対応するjarファイル内の場所である可能性があります。
あなたの場合、アプリケーションサーバーからクラスを読み込んでいるので
Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
ではなく
this.getClass().getClassLoader().getResourceAsStream(fileName)
.
this.getClass().getResourceAsStream()
も動作します。
読む この記事 をクリックすると、その問題についての詳細な情報が得られます。
Tomcat7以下をお使いの方へのご注意
この質問に対する回答の中に、私の説明がTomcat7では間違っているようだと書かれています。 なぜそうなるのか、いろいろと調べてみました。
そこで、ソースコードを見てみると、Tomcatの
WebAppClassLoader
は、いくつかのバージョンの Tomcat で使用されています。の実装は
findResource(String name)
(要求されたリソースへのURLを生成する最終的な責任を負う)Tomcat 6とTomcat 7はほぼ同じですが、Tomcat 8では異なっています。
バージョン 6 と 7 では、実装はリソース名の正規化を試みない。つまり、これらのバージョンでは
classLoader.getResourceAsStream("/resource.txt")
と同じ結果にはならないかもしれません。
classLoader.getResourceAsStream("resource.txt")
イベントが発生するはずです (Javadocで指定されているからです)。
[ソースコード]
しかし、バージョン8では、リソース名は正規化され、リソース名の絶対バージョンが使用されることが保証されます。したがって、Tomcat 8では、上記の2つの呼び出しは常に同じ結果を返すはずです。 [ソースコード]
そのため、以下のような場合、特に注意が必要です。
ClassLoader.getResourceAsStream()
または
Class.getResourceAsStream()
また、8より前のバージョンのTomcatでは
class.getResourceAsStream("/resource.txt")
実際には
classLoader.getResourceAsStream("resource.txt")
(先頭の
/
は取り除かれます)。
関連
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをInputStreamに変換する方法を教えてください。
-
[解決済み] JavaでInputStreamをバイト配列に変換する
-
[解決済み] OutputStreamをInputStreamに変換する方法は?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み】SLF4J:クラス "org.slf4j.impl.StaticLoggerBinder" の読み込みに失敗しました。
-
[解決済み】NoClassDefFoundErrorとClassNotFoundExceptionの原因や違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Class.getResource()とClassLoader.getResource()の違いは何ですか?
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] 型の不一致:ArrayListからListへの変換ができない
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] Javaで静的メソッドからgetClass()を呼び出す方法は?
-
[解決済み】リソーステキストファイルを文字列に読み込むユーティリティ(Java)【終了しました