从opencsv java包重置CsvToBean的迭代器

时间:2018-12-26 11:41:25

标签: java opencsv

我正在使用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软件包正确重置阅读器的阅读器?

1 个答案:

答案 0 :(得分:1)

使用传递到FileInputStream对象的BufferedReader,并将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