Java プログラムからリソース(ファイル)を読み込む方法を幾つか紹介。 以下で見る方法は、どれも java.io.InputStream を取得する方法ですが、どのフォルダを基点にするかが違います。 ここで見るのは次の3つです:
- ベース・フォルダ上のファイル
- ソースファイルと同じフォルダ上にあるファイル
- システムリソース
例えば、org.sample.Main というクラスに対して
- ベース・フォルダ上のファイル → 「base-resource.txt」
- ソースファイルと同じフォルダ上にあるファイル → 「package-resource.txt」
- システムリソース → 「system-resource.txt」
としてパッケージ階層とその読み取り方を図示すると、以下のようになります:
ベース・フォルダ上のファイルを読み込む
Java プログラムを実行しているフォルダ上のファイルを読み込むには、java.io.FileInputStream を用います:
new FileInputStream("base-resource.txt");
ソースファイルと同じフォルダ上にあるファイルを読み込む
あるクラスに対して、その Java ソースファイルが配置されているのと同じフォルダ上にあるリソースを読み取るには、そのクラスを取得して、getResourceAsStream() メソッドを呼び出します*1:
getClass().getResourceAsStream("package-resource.txt");
幾つか注意を:
- この方法でリソースを読み取るコードを書いたクラスに対して継承を行うと、(getClass() メソッドで返されるクラスが異なるため)予期しない動作をする場合があります。
- Maven2 を用いて開発を行っている場合、「src/main/resources」フォルダ下にパッケージ階層に対応するフォルダ構造を作成して、そこにリソースファイルを配置してください。
システムリソースを読み込む
上記の方法とは違い、ソースファイルの配置場所によらずリソースを読み込みたい場合は、ClassLoader#getSystemResourceAsStream() メソッドを用います。 これは、パッケージ階層が始まる基点からリソースを探します:
ClassLoader.getSystemResourceAsStream("system-resource.txt");
Maven2 を用いて開発を行っている場合、「src/main/resources」フォルダ下にリソースファイルを配置してください。
ちなみに、この方法で上記の "package-resource.txt" ファイルを読み込みたい場合は以下のようにします:
ClassLoader.getSystemResourceAsStream("org/sample/package-resource.txt");
パッケージ階層に対応するフォルダ階層を表すためには、ピリオド (.) の代わりにスラッシュ (/) を用います*2。