Java 如何使用FileUtils从JUnit测试中的resources目录中读取csv文件
在标准maven项目的资源目录中有一个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
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
构造函数,该构造函数接受CSVString
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
构造函数,该构造函数接受CSVString
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我在我的评论中没有看到任何表明这一点的内容。