ホームページ > Java > &#&チュートリアル > ファイルをInputStreamとしてロードする場合、「ClassLoader.getResourceAsStream()」と「Class.getResourceAsStream()」はどのように異なりますか?

ファイルをInputStreamとしてロードする場合、「ClassLoader.getResourceAsStream()」と「Class.getResourceAsStream()」はどのように異なりますか?

Linda Hamilton
リリース: 2024-12-23 17:21:15
オリジナル
699 人が閲覧しました

How Do `ClassLoader.getResourceAsStream()` and `Class.getResourceAsStream()` Differ When Loading Files as InputStreams?

ファイルを InputStream としてロードするさまざまな方法

渡されたファイル名の解釈には微妙な違いがあります。基本的に、ClassLoader.getResourceAsStream() と Class.getResourceAsStream() という 2 つの異なるメソッドがあります。これら 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.

この投稿で場所について言及するときは、それが 1 つである可能性があります。リソースのロード元のクラスや ClassLoader に応じて、ファイル システム自体または対応する JAR ファイル内の場所。

あなたの場合、アプリケーション サーバーからクラスをロードしているため、 this.getClass().getClassLoader().getResourceAsStream(filename) の代わりに Thread.currentThread().getContextClassLoader().getResourceAsStream(filename) を使用する必要があります。 this.getClass().getResourceAsStream() も機能します。

この特定の問題の詳細については、この記事をお読みください。

Tomcat 7 以前のユーザー向けのメモ

この質問に対する回答の 1 つは、Tomcat 7 に関する私の説明が間違っているようだと述べています。私はその理由を理解しようとしていました。

そこで、Tomcat のさまざまなバージョンの Tomcat の WebAppClassLoader のソース コードを調べました。 findResource(String name) の実装 (要求されたリソースへの URL を最終的に担当します) は、Tomcat 6 と Tomcat 7 ではほぼ同じですが、Tomcat 8 では異なります。

バージョン 6 および 7 では、実装はリソース名の正規化を試みません。これは、これらのバージョンでは、(Javadoc に記載されているように) classLoader.getResourceAsStream("/resource.txt") が classLoader.getResourceAsStream("resource.txt") と同じ結果を返さない可能性があることを意味します。 [ソースコード]

ただし、バージョン 8 では、リソース名の絶対バージョンが使用されるようにリソース名が正規化されます。したがって、上記の 2 つの呼び出しは、Tomcat 8 では常に同じ結果を生成するはずです。 [ソースコード]

したがって、Tomcat 8 より前のバージョンで ClassLoader.getResourceAsStream() または Class.getResourceAsStream() を使用する場合は、特に注意する必要があります。また、class.getResourceAsStream("/resource.txt") は実際には classLoader.getResourceAsStream("resource.txt") を呼び出すことにも留意する必要があります (先頭の / は削除されます)。

以上がファイルをInputStreamとしてロードする場合、「ClassLoader.getResourceAsStream()」と「Class.getResourceAsStream()」はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート