JAVA を使用してファイルを取得することは簡単に思えますが、私のような多くの初心者にとって、それを使用する経験は非常に奥深く、取得する場合に最も一般的に使用される方法は、JAVA の File クラスを使用することです。 c :/test.txt ファイルでは、File file = new File("c:/test.txt"); を使用します。この使用法では何が問題になるのでしょうか。JAVA の場合、パスがハードコードされていることは誰もが知っていると思います。精神、アプリケーション 一度作成すればどこでも利用できるようにする必要があり、実際のアプリケーションに関しては、最終的に生成されたアプリケーションは Windows 以外のオペレーティング システムにも展開されます。Linux の場合、アプリケーション内で c:/ という単語を使用すると失敗を意味します。 、ハードコーディングの使用、つまり絶対パスを直接使用することは避けるべきです。
サーブレットアプリケーションにはgetRealPath(String str)メソッドもありますが、このメソッドも絶対パスを直接手書きせずに動的にファイルのパスを取得することができますが、これも推奨されないメソッドです。ファイルを取得するもっと良い方法はありますか?
それは Class.getResource() メソッドと Class.getResourceAsStream() メソッドですが、多くの人はまだその使用法を理解していません。もちろん、これを十分に使いこなしている人もいますが、そのような人は注意する必要はありません。そうでない人のためにここでは少しだけ説明します。知っているか、あまり詳しくないか。
まず、JavaのgetResourceAsStreamには以下の種類があります:
1. Class.getResourceAsStream(String path): パスが「/」で始まらない場合、デフォルトではパッケージからリソースを取得します。このクラスは、'/' で始まる場合に配置されます。
ClassPath ルートから取得されます。 path を介して絶対パスを構築するだけで、最終的にリソースは ClassLoader によって取得されます。
2. Class.getClassLoader.getResourceAsStream(String path): デフォルトでは、ClassPath ルートから取得されます。パスは「/」で始めることはできません。 最後に、ClassLoader はリソースを取得します。
3. ServletContext.getResourceAsStream(String path): デフォルトでは、Tomcat の下でパスが「/」で始まるかどうかは関係ありません。コンテナの実装。
4. Jsp配下のアプリケーション組み込みオブジェクトは上記のServletContextの実装です。
ちなみに、JAVAには3つのローダーがあります:
合計3つのローダーがあります
ブートストラップクラスローダー: JAVAコアクラス(jreの下のlibおよびclassディレクトリの内容)のロードを担当します
拡張クラスローダー: JAVA 拡張クラス (jre の下の lib/ext ディレクトリ内のコンテンツ) のロードを担当します
同時に、ユーザーは独自の ClassLoader を定義して特別なリソースをロードすることもできます。
これには、Class.getClassLoader() と Thread.currentThread.getContextClassLoader() の違いが関係します。
簡単な例を挙げてみましょう:
ある日、JAVA がコンピューターの標準カメラを起動するための StartCamera というクラスを提供し、このクラスを jar にパッケージ化したとします。
通常の状況では、カメラを起動する場合は、この jar をクラスパスに設定するだけで済みます。システム クラスローダーは、システムの起動時にこのクラスをアプリケーションにロードします。
ただし、カメラのメーカーが異なるため、新しいデバイスには複数の異なる StartCamera 実装が存在し、実際のユーザーがどれを使用するかはわかりません。そこで、特定のデバイス タイプに対応する StartCamera クラスをロードするように ClassLoader をカスタマイズしました。
このように表示されます: 最初に定義したクラスをロードし、ロードできない場合はシステムのクラスをロードします。このような要求は、システムのデフォルトの
親委任読み込みメカニズム
では満たすことができません。 これが Thread.currentThread.getContextClassLoader() の生成方法です。 Thread.currentThread.setContextClassLoader() を使用して現在のスレッドに対応する ClassLoader を指定し、get を使用してそれを取得します。
以上がJava での getResourceAsStream の使用法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。