Я использую пакет 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: 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)Caused by: java.lang.NullPointerException at
com.opencsv.bean.HeaderColumnNameMappingStrategy.captureHeader(HeaderColumnNameMappingStrategy.java:117)
at com.opencsv.bean.CsvToBean.prepareToReadInput(CsvToBean.java:466)
... 2 more
Как правильно сбросить ридер ридера с пакетом opencsv?




Использование FileInputStream, переданного объекту BufferedReader, и сброс курсора FileInputStream на 0 решили мою проблему.
Я смешивал 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