LoginSignup
14
23

More than 3 years have passed since last update.

【Java】src/main/resourcesにあるファイルを読み込む

Last updated at Posted at 2019-10-23

Javaでsrc/main/resourcesにあるファイルを読み込むのに少し手間取ったので備忘録です。

1. ルートからの絶対パスで取得

src/main/resources/sample1.txt
sample1
src/main/java/Foo.java
public void sample1() {
    String path = "src/main/resources/sample1.txt";
    try (BufferedReader br = Files.newBufferedReader(Paths.get(path))) {

        System.out.println(br.readLine());

    } catch (IOException e) {
        e.printStackTrace();
    }
}
実行結果
sample1

2. クラスパスからの相対パスで取得

src/main/resources/sample2.txt
sample2
src/main/java/Foo.java
public void sample2() {
    String path = "/sample2.txt";
    // staticメソッドの場合はFoo.class.getResourceAsStreamのように書く(Fooはクラス名)
    try (InputStream is = getClass().getResourceAsStream(path);
        BufferedReader br = new BufferedReader(new InputStreamReader(is))) {

        System.out.println(br.readLine());

    } catch (IOException e) {
        e.printStackTrace();
    }
}
実行結果
sample2

注意点

1.と2.では、テストの際、src/test/resourcesに同名ファイルが有るときの動きが異なります。

src/test/resources/sample1.txt
test1
src/test/resources/sample2.txt
test2
src/test/java/FooTest.java
public class FooTest {
  @Test
  public void testInput() throws Exception {
    Foo foo = new Foo();
    foo.sample1();  // src/main/resources/sample1.txtを読み込む
    foo.sample2();  // src/test/resources/sample2.txtを読み込む
  }
}
実行結果
sample1
test2

1.の場合は、パスを直書きしているので当たり前ですが、src/main/resourcesディレクトリ下のsample1.txtを読み込みます。
2.の場合は、src/main/resourcesに優先してsrc/test/resourcesディレクトリ下のsample2.txtを読み込んでいます。

なお、src/test/resourcesディレクトリにsample2.txtがなければ、そのままsrc/main/resourcesディレクトリ下のsample2.txtが読み込まれます。

まとめ

とりあえずClass#getResourceAsStreamを使っておけば良いかと。
何か問題があれば教えていただけると助かります。

参考:
リソースの取得
【Java】クラスパス上のファイルを取得する方法の違いについて

余談

Class#getResourceAsStreamではなく、Class#getResource経由で絶対パスを取得し、Paths#getに渡したところ java.nio.file.InvalidPathExceptionとなりました。

String filename= "/sample2.txt";
String filepath = getClass().getResource(filename).getPath();
Path path = Paths.get(filepath); // java.nio.file.InvalidPathException

どうもWindows環境ではドライブレター部分のエスケープが必要なようで、以下のように置換したところ取得できました。

String filename= "/sample2.txt";
String filepath = getClass().getResource(filename).getPath();
Path path = Paths.get(filepath .replaceFirst("^/(.:/)", "$1")); // OK

参考: create Java NIO ファイル・パスの問題



最後までお読み頂きありがとうございました。
質問や不備についてはコメント欄かTwitterまでお願いします。

14
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
23