В этом руководстве по Java мы научимся преобразовывать OutputStream в InputStream, который может нам понадобиться при чтении данных из одного источника, возвращающего выходной поток; а также при записи/передаче данных другому целевому объекту, которому требуются данные во входном потоке.
1. Использование ByteArrayInputStream
ByteArrayInputStream содержит внутренний буфер, содержащий байты, которые могут быть прочитаны из потока. Мы можем прочесть байты из входного потока и сохранить их в его внутреннем буфере. Позже приложение может использовать байты, сохраненные в ByteArrayInputStream, как входной поток.
Здесь мы будем использовать массив байтов для хранения и передачи промежуточных данных. Поток будет следующим:
OutputStream -> byte[] -> InputStream
В данном примере мы создаем выходной поток из файла для демонстрационных целей. Затем передаем байты из файла во входной поток.
//OutputStreamByteArrayOutputStream outStream = new ByteArrayOutputStream(new File("path/file"));//byte[] -> InputStreamByteArrayInputStream inStream = new ByteArrayInputStream( outStream.toByteArray() )
Это самый простой способ преобразования OutputStream в InputStream в Java.
2. Копирование OutputStream в InputStream с использованием каналов NIO
Вышеуказанный подход весьма полезен, когда у вас ограниченные и небольшие данные в OutputStream. Если у вас есть большой объем данных, то вы хотите выполнить преобразование в реальном времени в форме потока, где все данные не хранятся в буфере – в любой момент времени.
Другими словами, вам нужно будет создать конвейерный подход, при котором данные передаются с одного конца на другой, и нет необходимости хранить полные данные в буфере.
try(FileOutputStream fos = new FileOutputStream(new File("path/out/file"));FileInputStream fis = new FileInputStream(new File("path/in/file"));) {FileChannel outputChannel = fos.getChannel();FileChannel inputChannel = fis.getChannel();outputChannel.transferTo(0, inputChannel.size(), inputChannel);}
Подробнее: Java NIO – передача данных между каналами
Вот и все. Если у вас есть более эффективные и практичные способы преобразования выходного потока во входной поток в Java, пожалуйста, поделитесь с нами.