从 opencsv java 包中重置 CsvToBean 的迭代器
Reset the iterator of CsvToBean from opencsv java package
我正在使用 opencsv
包读取 .csv
文件。
我想多次读取同一个 .csv
文件而不重新打开文件并且不重新创建 Reader
对象。
我正在使用 Reader
对象的 reset()
方法在文件开头重置阅读光标。
这是我正在使用的代码:
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
不幸的是,当我想访问 CsvToBean<T>
对象的 Iterator
时,我遇到了以下错误:
java.lang.RuntimeException: Error capturing CSV header!
at
com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:468)
at com.opencsv.bean.CsvToBean.iterator(CsvToBean.java:487)
at com.myproject.test.main(test.java:37)
原因:java.lang.NullPointerException
在
com.opencsv.bean.HeaderColumnNameMappingStrategy.captureHeader(HeaderColumnNameMappingStrategy.java:117)
at com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:466)
... 2 more
如何使用 opencsv
包正确重置 reader 的 reader?
使用传递给 BufferedReader
对象的 FileInputStream
,并将 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
我正在使用 opencsv
包读取 .csv
文件。
我想多次读取同一个 .csv
文件而不重新打开文件并且不重新创建 Reader
对象。
我正在使用 Reader
对象的 reset()
方法在文件开头重置阅读光标。
这是我正在使用的代码:
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
不幸的是,当我想访问 CsvToBean<T>
对象的 Iterator
时,我遇到了以下错误:
java.lang.RuntimeException: Error capturing CSV header! at
com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:468)
at com.opencsv.bean.CsvToBean.iterator(CsvToBean.java:487)
at com.myproject.test.main(test.java:37)原因:java.lang.NullPointerException 在
com.opencsv.bean.HeaderColumnNameMappingStrategy.captureHeader(HeaderColumnNameMappingStrategy.java:117)
at com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:466)
... 2 more
如何使用 opencsv
包正确重置 reader 的 reader?
使用传递给 BufferedReader
对象的 FileInputStream
,并将 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