Сбросить итератор CsvToBean из пакета 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: 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 369
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование 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

Другие вопросы по теме