リソース ファイルをロードするには、一般的に 2 つの方法が使用されます。
1. ClassLoader を使用する ここで、Java に組み込まれている ClassLoader の分類について触れなければなりません。
1 つ目は C++ で書かれたルート クラス ローダー (ブートストラップ クラス ローダー) で、java.lang.Object やその他のランタイム コードなどのいくつかの主要な Java クラスをメモリにロードします。 ロードを担当するパッケージ: BootStrp------>JRE/lib/rt.jar
2 つ目は拡張クラス ローダー (ExtClassLoader) です。これは Java クラスによって作成され、JRE 内の一部のクラスをメモリにロードします。ロードを担当するパッケージ: ExtClassLoader---------->JRE/lib/ext/*.jar
3 番目のタイプは、アプリケーション クラス ローダー (AppClassLoader) またはシステム クラス ローダーで、CLASSPATH 内のクラスをメモリにロードする役割を果たします。アプリケーション クラス ローダーは、ClassLoader.getSystemClassLoader(); を通じて取得できます。
クラスローダーの継承について話しましょう。クラスローダーは垂直継承の親子関係ではなく、クラスローダーをインスタンス化するときに、親クラスローダーのインスタンスを構造としてクラスローダーに渡すことができます。容器内のパラメータ。
クラスローダーの詳細については、自分で検索してください。
アプリケーション クラス ローダーを取得したら、loader.getResource(path) を呼び出して、対応するパスにリソース ファイルをロードします。パッケージ内のリソースについては、「/」で始めることはできません。パッケージを通常のフォルダーとして扱い、各パッケージを「/」で区切ります。
例: URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser"); は、デモ パッケージ内の names.ser シリアル化ファイルを取得します。
2. ロードする必要がある現在のクラスの getResource メソッドを使用してロードします。実際には、このメソッドもこのクラスをロードするクラス ローダーを呼び出してリソース ファイルを取得しますが、取得されるパラメータは異なります。
(1) クラスが配置されているパッケージ内のファイルを取得したい場合は、相対パスを使用してパッケージ内のリソースに直接アクセスできます。例: Demo1.class.getResource("names.ser");取得するのは、Demo1 のクラス ファイルが配置されているパッケージ内のリソースです。
(2) パッケージ外のリソース ファイルを取得するには、URL url = Demo1.class.getResource("/demo/names.ser") のように、ファイルは「/」で始まる必要があります。取得されるのは、次のとおりです。デモパッケージ
実際、2 番目のメソッドは最初のメソッドをカプセル化したもので、どちらも ClassLoader を使用してリソース ファイルを読み込みます。なぜそんなことを言うのですか? Class クラスのソース コードを見ると、次のことがわかります。