我的项目结构如下:

/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/

我在/src/test/resources/test.csv中有一个文件,我想从/src/test/java/MyTest.java中的单元测试中加载该文件

我有个不能用的代码。它会提示“没有这样的文件或目录”。

BufferedReader br = new BufferedReader (new FileReader(test.csv))

我也试过这个

InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))

这也行不通。它返回null。我正在使用Maven构建我的项目。


当前回答

这里有一个使用番石榴的快速解决方案:

import com.google.common.base.Charsets;
import com.google.common.io.Resources;

public String readResource(final String fileName, Charset charset) throws IOException {
        return Resources.toString(Resources.getResource(fileName), charset);
}

用法:

String fixture = this.readResource("filename.txt", Charsets.UTF_8)

其他回答

当不运行Maven-build jar时(例如从IDE运行时),代码还能工作吗?如果是,请确保该文件确实包含在jar中。资源文件夹应该包含在pom文件中,在<build><resources>中。

我也遇到过同样的问题。

类装入器没有找到该文件,这意味着它没有打包到工件(jar)中。您需要构建项目。例如,使用maven:

mvn clean package

因此,您添加到资源文件夹中的文件将进入maven构建,并对应用程序可用。

我想保留我的答案:它没有解释如何读取文件(其他答案解释了这一点),它回答了为什么InputStream或资源为空。这里也有类似的答案。

从src/resources文件夹读取文件,然后尝试这样做:

DataSource fds = new FileDataSource(getFileHandle("images/sample.jpeg"));

public static File getFileHandle(String fileName){
       return new File(YourClassName.class.getClassLoader().getResource(fileName).getFile());
}

对于非静态引用:

return new File(getClass().getClassLoader().getResource(fileName).getFile());

getResource()只能在src/main/resources中使用资源文件。要获取src/main/resources路径之外的文件,比如src/test/java,你需要明确地创建它。

下面的例子可能会帮助你

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

public class Main {
    public static void main(String[] args) throws URISyntaxException, IOException {
        URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
        BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt")));
    }
}

我在测试文件夹中找不到我的文件,即使我按照答案。重建项目解决了这个问题。IntelliJ似乎没有自动识别新文件。发现这个很让人不快。