Лучший способ передать данные по каналу от одного Входного Потока до нескольких Потоков вывода

Соединение PipedInputStream/PipedOutputStream работает отлично, когда данные только должны быть переданы по каналу к одному выводу, но если несколько потоков вывода подключены к одному входному потоку, данные становятся фрагментированными через различные выводы. Мое текущее решение включает наличие потокового "читателя", который считывает данные с InputStream и затем пишет данные в объекты OutputStream, которые были связаны с читателем. Это, кажется, работает хорошо, но это кажется грязным и неэффективным для сравнения к собственным классам PipedIO.

Существует ли лучший способ обработать это или реализация, что я работаю с приблизительно как хороший, когда я собираюсь добраться?

9
задан Magnus 21 May 2015 в 08:03
поделиться

2 ответа

0
ответ дан 5 December 2019 в 02:27
поделиться

Если один входной поток должен быть прочитан несколькими потребителями, а входной поток является эфемерным (т. Е. Не является ресурсом, который можно «перемотать», или не поддерживает несколько входных указателей), вам, как правило, необходимо предоставить схему буферизации, которая ведет себя так, как будто он сохраняет каждый элемент данных до тех пор, пока его не прочитают все потребители.

У вас есть несколько вариантов реализации. Самый простой вариант - это то, что вы предлагаете, с накладными расходами, в первую очередь, с пространством для хранения нескольких копий данных в выходных буферах. Если проблема заключается в хранении, вы можете предоставить один буфер, который поддерживает отдельные указатели чтения, по одному для каждого потребителя, и хранит в памяти только данные между наименьшим и наибольшим указателями чтения. Если потребители будут читать данные с сильно различающейся скоростью, вы все равно можете получить большую часть или все входные данные в памяти, и в этот момент может потребоваться какое-то регулирование ввода или промежуточная схема буферизации диска.

Я предполагаю, что единственный входной поток не является постоянным (т.е. файл на диске) ... в этом случае решение тривиально.

1
ответ дан 5 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: