Существует много стандартных библиотек java и сторонних библиотек, в публичном API которых есть методы для записи или чтения из Stream
.Один пример - javax.imageio.ImageIO.write()
, для записи содержимого обработанного изображения в него требуется OutputStream
.Другим примером является iText библиотека для обработки PDF, которая берет OutputStream
, чтобы записать полученный PDF в нее.Третий пример - API AmazonS3 Java, который берет InputStream
, так что он будет считывать его и создавать файл в три хранилище S3 .
Проблема возникает, когда вы хотите объединить два из них.Например, у меня есть изображение BufferedImage
, для которого я должен использовать ImageIO.write
, чтобы выдать результат в OutputStream
.Но не существует прямого способа отправить его в Amazon S3, поскольку S3 требует InputStream
.
Существует несколько способов решить эту проблему, но предметом этого вопроса является использование ByteArrayOutputStream
.
Идея ByteArrayOutputStream
заключается в использовании промежуточного байтового массива, заключенного в Input/Output Stream
, чтобы парень, который хочет записать в выходной поток, записал в массив, а парень, который хочет прочитать, прочиталмассив.
Меня интересует, почему ByteArrayOutputStream
не разрешает доступ к байтовому массиву без его копирования, например, для предоставления InputStream
, который имеет прямой доступ к нему.Единственный способ получить к нему доступ - вызвать toByteArray()
, который создаст копию внутреннего массива (стандартного).Это означает, что в моем примере изображения у меня будет три копии изображения в памяти:
- Первый - это фактический
BufferedImage
, - секунда - это внутренняя
array
OutputStream
, а - третья - копия, созданная
toByteArray()
, поэтому я могу создатьInputStream
.
Чем оправдан этот дизайн?
- Скрытие реализации?Просто укажите
getInputStream()
, и реализация останется скрытой. - Многопоточность?
ByteArrayOutputStream
не подходит для доступа к нескольким потокам, так что это не может быть.
Более того, существует второй вариант ByteArrayOutputStream
, предоставляемый библиотекой Apache commons-io (которая имеет другую внутреннюю реализацию).Но оба имеют одинаковый публичный интерфейс, который не обеспечивает доступ к байтовому массиву без его копирования.