从 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 游标操作的 FileInputStreamBufferedReader 混合使用,后者提供了从 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