Looking for java Answers? Try Ask4KnowledgeBase
Looking for java Keywords? Try Ask4Keywords

Java Languageリソース(クラスパス上)


前書き

Javaでは、コンパイルされたクラスと一緒にJARの内部に格納されているファイルベースのリソースを取得できます。このトピックでは、これらのリソースをロードし、コードで使用できるようにすることに重点を置いています。

備考

リソースとは、パスのような名前のファイルのようなデータで、クラスパスに存在します。リソースの最も一般的な使用方法は、アプリケーションイメージ、サウンド、および読み取り専用データ(デフォルト設定など)をバンドルすることです。

リソースを使ってアクセスすることができClassLoader.getResourceClassLoader.getResourceAsStream方法。最も一般的な使用例は、リソースを読み取るクラスと同じパッケージに配置することです。 Class.getResourceClass.getResourceAsStream方法は、この一般的な使用例を提供しています。

getResourceメソッドとgetResourceAsStreamメソッドの唯一の違いは、前者がURLを返し、後者がそのURLを開き、InputStreamを返すことです。

ClassLoaderのメソッドは、パスのようなリソース名を引数として受け取り、その名前に一致するエントリをClassLoaderのクラスパス内の各位置で検索します。

  • クラスパスの場所が.jarファイルの場合、指定された名前のjarエントリは一致とみなされます。
  • クラスパスの場所がディレクトリの場合、指定された名前を持つそのディレクトリの下の相対ファイルは一致と見なされます。

リソース名は、相対URLのパス部分に似ています。 すべてのプラットフォームで、ディレクトリ区切り文字としてスラッシュ( / )を使用します。スラッシュで始めることはできません。

Classの対応するメソッドは、以下を除いて同様です。

  • リソース名はスラッシュで始まり、その場合は最初のスラッシュが削除され、残りの名前はClassLoaderの対応するメソッドに渡されます。
  • リソース名がスラッシュで始まらない場合は、getResourceメソッドまたはgetResourceAsStreamメソッドが呼び出されているクラスに対して相対的な名前として扱われます。実際のリソース名は、 パッケージは、パッケージの名前であるパッケージ / 名前となるクラスはスラッシュで置き換え各周期で、所属、 名前がメソッドに渡さ元引数されます。

例えば:

package com.example;

public class ExampleApplication {
    public void readImage()
    throws IOException {

        URL imageURL = ExampleApplication.class.getResource("icon.png");

        // The above statement is identical to:
        // ClassLoader loader = ExampleApplication.class.getClassLoader();
        // URL imageURL = loader.getResource("com/example/icon.png");

        Image image = ImageIO.read(imageURL);
    }
}

リソースは、クラスがパッケージに置かれるのと同じ理由で、.jarファイルのルートではなく、名前付きパッケージに配置する必要があります。たとえば、複数の.jarファイルがクラスパス内にあり、複数の.jarファイルがルートにconfig.propertiesエントリを含む場合、getResourceメソッドまたはgetResourceAsStreamメソッドを呼び出すと、最初にリストされている.jarからconfig.propertiesが返されますクラスパスJava EEのように、クラスパス順序がアプリケーションの直接の制御下にない環境では、これは予測可能な動作ではありません。

すべてのgetResourceおよびgetResourceAsStreamメソッドは、指定されたリソースが存在しない場合はnull返しnull 。ビルド時にアプリケーションにリソースを追加する必要があるため、コードが書き込まれるときにリソースの位置を知る必要があります。実行時にリソースを見つけることができないのは、通常、プログラマーのエラーの結果です。

リソースは読み取り専用です。リソースに書き込む方法はありません。初心者の開発者は、IDE(Eclipseなど)で開発するときにリソースが別の物理ファイルであるため、一般的なケースでは別の物理ファイルのように扱うことが安全であると仮定して間違いを犯すことがよくあります。しかし、これは正しくありません。アプリケーションはほとんどの場合、.jarまたは.warファイルなどのアーカイブとして配布されます。そのような場合、リソースは個別のファイルではなく、書き込み可能ではありません。 (URLクラスのgetFileメソッドはこれを回避する方法ではなく 、名前にもかかわらずURLのパス部分を返すだけであり、これは決して有効なファイル名であることは保証されません)。

実行時にリソースをリストする安全な方法はありません。ここでも、開発者はビルド時にリソースファイルをアプリケーションに追加する責任があるため、開発者は既にそのパスを知っているはずです。回避策がありますが、信頼性がなく、最終的には失敗します。

リソース(クラスパス上) 関連する例