web-dev-qa-db-ja.com

src / main / resourcesのFileNotFoundException

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の下のクラスパスのルートフォルダーに配置されます。なぜプログラムはここでファイルを見つけることができないのですか?

17
Mulgard

ファイルをクラスパスにパッケージ化する場合は、クラスパスからそれを読み取ります。

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);
        }
    }
}

enter image description here

enter image description here

19
Paul Samsotha

これをパスとして指定してください:

BufferedReader br = new BufferedReader(new FileReader(new 
File("src/main/resources/temp.txt")));
4
Akshay Indalkar

Jenkinsで統合テストを設定するときにこの問題がありました。
この問題は、名前にスペースが含まれるフォルダー内にジョブがあるために発生しました。そのため、Jenkinsはfoo barという名前のワークスペースフォルダーを作成する代わりにfoo%20barを作成し、テストはすべてFileNotFoundExceptionで失敗しました。

解決策は、フォルダの名前を変更して、スペースが含まれないようにすることです。

1
Adrian Chu

Mavenは/src/main/resouces/の下のファイルをクラスパスのデフォルトパッケージに配置します。したがって、クラスローダーを介してロードできます。

InputStream in = getClass().getResourcesAsStream("temp.txt")

詳細については、 Class#getResoucesAsStream を参照してください。

0
gregor