我正在使用opencsv
包来读取.csv
文件。
我想多次读取同一个.csv
文件,而无需重新打开该文件,也无需重新创建Reader
对象。
我正在使用reset()
对象的Reader
方法在文件的开头重置读取光标。
这是我正在使用的代码:
reader = Files.newBufferedReader(Paths.get(path));
csvToBean = new CsvToBeanBuilder(reader)
.withType(MyBean.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
it = csvToBean.iterator();
while (it.hasNext()) {
MyBean csvData = it.next();
// blabla ...
}
reader.reset();
// I do not want to recreate the csvToBean object, i've done it to investigate error
// I got the same result zhe i do not recreate the object
csvToBean = new CsvToBeanBuilder(reader)
.withType(MyBean.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
it = csvToBean.iterator(); // <<<<<< FAILING HERE
不幸的是,当我想访问Iterator
对象的CsvToBean<T>
时,我遇到了以下错误:
java.lang.RuntimeException:捕获CSV标头时出错! 在
com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:468)
在com.opencsv.bean.CsvToBean.iterator(CsvToBean.java:487)
在com.myproject.test.main(test.java:37)
由以下原因引起:java.lang.NullPointerException
com.opencsv.bean.HeaderColumnNameMappingStrategy.captureHeader(HeaderColumnNameMappingStrategy.java:117)
在com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:466)
...还有2个
如何使用opencsv
软件包正确重置阅读器的阅读器?
答案 0 :(得分:1)
使用传递到FileInputStream
对象的BufferedReader
,并将FileInputStream
光标重置为0解决了我的问题。
我正在将提供IO光标操作的FileInputStream
与BufferedReader
混合使用,后者提供了从FileInputStream
加载多少字节的工具。我不好...
fIn = new FileInputStream(Paths.get(path).toString());
reader = new BufferedReader(new InputStreamReader(fIn));
csvToBean = new CsvToBeanBuilder(reader)
.withType(MyBean.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
it = csvToBean.iterator();
while (it.hasNext()) {
MyBean csvData = it.next();
// blabla ...
}
fIn.getChannel().position(0);
reader = new BufferedReader(new InputStreamReader(fIn));
csvToBean = new CsvToBeanBuilder(reader)
.withType(MyBean.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
it = csvToBean.iterator(); // <<<<<< NOT FAILING HERE