Я выполняю потоковое чтение объекта с помощью BufferedReader.
Мне нужно сделать две вещи с этим объектом:
- Передайте его в CSV-ридер SuperCSV
- Получить необработанные строки и хранить их в (Clojure) ленивой последовательности
В настоящее время мне приходится использовать два разных BufferedReaders: один в качестве аргумента для класса чтения CSV SuperCSV и один для инициализации отложенной последовательности необработанных строк. Я эффективно загружаю объект S3 дважды, что дорого ($) и медленно.
Один из моих коллег отметил, что я ищу что-то похожее на Unix-команду "tee". Было бы полезно использовать BufferedReader, который каким-то образом можно «разделить», загрузить порцию данных и передать копию как в ленивую последовательность, так и в функции чтения csv.
В настоящее время я также изучаю, возможно ли обернуть ленивую последовательность в BufferedReader и передать , что , в супер csv. У меня были некоторые проблемы с кучей Java при передаче очень больших ленивых последовательностей нескольким потребителям, поэтому я немного беспокоюсь об использовании этого решения.
Другое решение - просто загрузить файл локально, а затем открыть два потока для этого файла. Это устраняет первоначальную мотивацию потоковой передачи: позволяет начинать обработку файла, как только начинают поступать данные.
Окончательное решение, которое я бы рассмотрел только в том случае, если ничего не работает, заключается в реализации моего собственного считывателя CSV, который возвращает как проанализированный CSV, так и исходную непарсированную строку. Если вы использовали очень надежный CSV-ридер, который может возвращать как Java-хэш проанализированных CSV-данных, так и исходную неразобранную строку, пожалуйста, дайте мне знать!
Спасибо!