Если вы хотите создать OutputStream из InputStream, есть одна базовая проблема.Запись метода в блоки OutputStream до тех пор, пока это не будет сделано.Таким образом, результат доступен, когда метод записи закончен.Это имеет 2 последствия:
- Если вы используете только один поток, вам нужно подождать, пока все не будет записано (поэтому вам необходимо сохранить данные потока в памяти или на диске).
- Если вы хотите получить доступ к данным до их завершения, вам нужен второй поток.
Вариант 1 может быть реализован с использованием байтовых массивов или в виде файла.Вариант 1 может быть реализован с использованием pipies (напрямую или с дополнительной абстракцией - например, RingBuffer или google lib из другого комментария).
Действительно, со стандартным java другого способа решения проблемы не существует.Каждое решение является реализацией одного из них.
Существует одна концепция, называемая «продолжение» (подробности см. wikipedia ).В этом случае в основном это означает:
- существует специальный выходной поток, который ожидает определенный объем данных
- , если достигнута сумма, поток передает управление своему аналогу, которыйспециальный входной поток
- входной поток делает объем данных доступным до тех пор, пока он не будет прочитан, после этого он передает управление обратно в выходной поток
Хотя некоторые языки имеют такойКонцепция встроена, для Java вам нужно немного "магии".Например, "commons-javaflow" из apache реализует такое для java.Недостатком является то, что для этого требуются некоторые специальные модификации байт-кода во время сборки.Поэтому имеет смысл поместить все эти вещи в дополнительную библиотеку с пользовательскими сценариями сборки.