Что произойдет, если я не закрою BufferedReader в java? (Потоковое чтение в многопоточной программе)

У меня есть многопоточная программа, в которой я открываю BufferedReader для чтения содержимого из FIFO(named Pipe) файла. Поскольку я хочу внедрить потоковое решение для непрерывного чтения текста из файла FIFO, я создал BufferedReader вне выполнения задачи потока и хочу, чтобы он оставался открытым навсегда, пока приложение работает. (Нет close() на bufferedReader) С ограниченным (скажем, 10) потоком в ThreadPool будет продолжать искать текст в файле FIFO и обрабатывать этот текст для дальнейшей обработки. Поскольку я использую FIFO, он никогда не достигнет END OF FILE.

Делая это, для меньшего входного файла он читает успешно, для большого входного файла он выдает Stream closed IOexception (спорадически). Он закрывается автоматически, у меня нет инструкции close(). У меня есть код для получения и закрытия semaphore lock в том месте, где я использую br.readLine() для решения проблемы состояния гонки

java.io.IOException: Stream closed
    at java.io.BufferedReader.ensureOpen(BufferedReader.java:122) ~[?:1.8.0_152]
    at java.io.BufferedReader.readLine(BufferedReader.java:317) ~[?:1.8.0_152]
    at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_152]

Вопрос:

  1. Для этого решения я не хочу закрывать BufferedReader. Каковы последствия?
  2. Могу ли я иметь буферизованный читатель, который никогда не закрывается? если да, то какие шаги я должен рассмотреть в коде.

person Dkr    schedule 05.10.2018    source источник
comment
Я предлагаю иметь один поток чтения, который закрывает файл после его завершения.   -  person Peter Lawrey    schedule 05.10.2018
comment
@PeterLawrey: Здесь я пытаюсь прочитать потоковую передачу, а не набор данных, которые помещаются в файл. Вот почему я использую FIFO для непрерывного чтения по мере добавления новых данных.   -  person Dkr    schedule 11.10.2018
comment
Это то, что мы делаем с Chronicle Queue, вы обнаружите, что гораздо проще иметь одну цепочку для чтения.   -  person Peter Lawrey    schedule 12.10.2018


Ответы (1)


BufferedReader не является потокобезопасным классом, поэтому мы можем получить бесчисленное количество различных ошибок при попытке использовать один и тот же объект этого класса из разных потоков.

person denis.zhdanov    schedule 05.10.2018
comment
Это верно. Какая программа для чтения файлов подойдет для такого типа проблем? Как насчет использования InputStream с синхронизацией - person Dkr; 05.10.2018
comment
Не имеет смысла иметь несколько потоков, конкурирующих за файл. Читать файл в одном потоке, помещать элементы для обработки один за другим в некоторую очередь и обрабатывать их, используя пул рабочих процессов (если обработка является узким местом) - person Roman Konoval; 05.10.2018
comment
У меня также есть код для получения и освобождения блокировки семафора во время br.readLine() - person Dkr; 05.10.2018
comment
@RomanKonoval Я не читаю обычный файл. FIFO в Linux работает как очередь. - person Dkr; 05.10.2018