mavenプロジェクトのsrc/main/resourcesの下にファイルを配置しました。ファイル名は単にtemp.txtです。
ファイルを開こうとすると:
BufferedReader br = new BufferedReader(new FileReader(new File("./temp.txt")));
エラーが発生します:
Exception in thread "main" Java.io.FileNotFoundException: \temp.txt
src/main/resourcesの下のすべてのファイルは、mavenの下のクラスパスのルートフォルダーに配置されます。なぜプログラムはここでファイルを見つけることができないのですか?
ファイルをクラスパスにパッケージ化する場合は、クラスパスからそれを読み取ります。
Mavenの構造
src
main
resources
file.txt
ビルド後、ファイルはクラスパスのルートに配置されます。だから使用する
InputStream is = getClass().getResourceAsStream("/file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
/
の前に file.txt
は、クラスが含まれているパッケージからルートに移動します。
[〜#〜] update [〜#〜]
試験例
package com.underdogdevs.stackoverflow;
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
public class TestResourceFile {
public static void main(String[] args) throws IOException {
InputStream is = TestResourceFile.class.getResourceAsStream("/test.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
これをパスとして指定してください:
BufferedReader br = new BufferedReader(new FileReader(new
File("src/main/resources/temp.txt")));
Jenkinsで統合テストを設定するときにこの問題がありました。
この問題は、名前にスペースが含まれるフォルダー内にジョブがあるために発生しました。そのため、Jenkinsはfoo bar
という名前のワークスペースフォルダーを作成する代わりにfoo%20bar
を作成し、テストはすべてFileNotFoundException
で失敗しました。
解決策は、フォルダの名前を変更して、スペースが含まれないようにすることです。
Mavenは/src/main/resouces/
の下のファイルをクラスパスのデフォルトパッケージに配置します。したがって、クラスローダーを介してロードできます。
InputStream in = getClass().getResourcesAsStream("temp.txt")
詳細については、 Class#getResoucesAsStream を参照してください。