倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

リソースの読み込み

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

*1:static メソッド内から呼び出す場合は、Xxxx.class.getResourceAsStream(...) とします。

*2:Windows では バックスラッシュ (\) でも大丈夫なようですが、エスケープを忘れずに。 "org\\sample\\package-resource.txt"