Java 如何使用FileUtils从JUnit测试中的resources目录中读取csv文件

Java 如何使用FileUtils从JUnit测试中的resources目录中读取csv文件,java,apache-commons,apache-commons-io,apache-commons-csv,Java,Apache Commons,Apache Commons Io,Apache Commons Csv,在标准maven项目的资源目录中有一个csv文件,如下所示: src/main/resources/fruits.csv src/test/resources/fruits.csv 水果.csv Type, Quantity apple, 50 banana, 60 orange, 70 使用以下库 朱尼特 朱尼特 4.12 org.apache.commons 公共空间 1 公地io 公地io 2.4 水果(标准POJO) CsvFileReader public class CsvF

在标准maven项目的资源目录中有一个csv文件,如下所示:

src/main/resources/fruits.csv
src/test/resources/fruits.csv
水果.csv

Type, Quantity
apple, 50
banana, 60
orange, 70
使用以下库


朱尼特
朱尼特
4.12
org.apache.commons
公共空间
1
公地io
公地io
2.4
水果(标准POJO)

CsvFileReader

public class CsvFileReader {

    private static final String [] FILE_HEADER = {""};

    private static final String TYPE = "Type";
    private static final String QUANTITY + "Quantity";

    public static List<Candidate> readCsvFile(File fileName) {
        FileReader fileReader = null;
        CSVParser csvFileParser = null;

        CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER);
        List<Candidate> fruits = null;
        try {
            fruits = new ArrayList<>();
            String file = FileUtils.readFileToString(fileName);
            fileReader = new FileReader(file);
            csvFileParser = new CSVParser(fileReader, csvFormat);
            List<CSVRecord> records = csvFileParser.getRecords();

            for (int i = 1; i < records.size(); i++) {
                CSVRecord record = records.get(i);
                Fruit fruit = new Fruit(record.get(TYPE), Integer.parseInt(QUANTITY));
                fruits.add(fruit);
            }
        } 
        catch(Throwable t) {
            t.printStackTrace();
        } 
        finally {
            try {
                fileReader.close();
                csvFileParser.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        return fruits;
    }
}
在Eclipse中运行JUnit测试用例时:

java.io.FileNotFoundException: Type, Quantity
apple, 50
banana, 60
orange, 70
(File name too long)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at java.io.FileReader.<init>(FileReader.java:58)
java.io.FileNotFoundException:类型、数量
苹果,50岁
香蕉,60
橙色,70
(文件名太长)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:146)
位于java.io.FileInputStream。(FileInputStream.java:101)
位于java.io.FileReader。(FileReader.java:58)
它似乎在读取文件,但问题是文件名太长


我做错了什么?

FileReader
构造函数需要一个指向文件的路径,在该路径中传递文件的内容。您可以直接使用
CSVParser
构造函数,该构造函数接受CSV
String

csvFileParser = new CSVParser(file /*This is already file content*/, csvFormat);
**编辑**

更好的做法是获取资源的读取器并将其传递给CSVParser构造函数:

reader = new BufferedReader(new InputStreamReader(
                       this.getClass().getResourceAsStream("fruits.csv")));
csvFileParser = new CSVParser(reader, csvFormat);

FileReader
构造函数需要一个文件路径,在该路径中传递文件的内容。您可以直接使用
CSVParser
构造函数,该构造函数接受CSV
String

csvFileParser = new CSVParser(file /*This is already file content*/, csvFormat);
**编辑**

更好的做法是获取资源的读取器并将其传递给CSVParser构造函数:

reader = new BufferedReader(new InputStreamReader(
                       this.getClass().getResourceAsStream("fruits.csv")));
csvFileParser = new CSVParser(reader, csvFormat);

在src/main/resources(或src/test/resources)下存储文件的全部目的是使文件在运行时(resp.test)类路径中作为资源可用,并能够使用类加载器加载它。使用
SomeClass.class.getResourceAsStream(“/fruits.csv”)
获取资源上的InputStream。不要使用文件IO。我假设POJO只是一个示例,对吗?因为构造函数缺少第二个argumentVogel612的类型-感谢您指出-我做了适当的编辑@JB Niset,你是说我应该通过maven运行JUnit测试,而不是通过Eclipse运行它吗?@socal_javaguy我在我的评论中没有看到任何表明这一点的东西。将文件存储在src/main/resources(或src/test/resources)下的全部目的是让文件作为资源在运行时(resp.test)类路径中可用,并且能够用类加载器加载它。使用
SomeClass.class.getResourceAsStream(“/fruits.csv”)
获取资源上的InputStream。不要使用文件IO。我假设POJO只是一个示例,对吗?因为构造函数缺少第二个argumentVogel612的类型-感谢您指出-我做了适当的编辑@JB Niset,你是说我应该通过maven而不是通过Eclipse运行JUnit测试吗?@socal_javaguy我在我的评论中没有看到任何表明这一点的内容。