Создание Java InputStream из Enumerator [Array [Byte]]
Я много читал в Iteratees и Enumerators, чтобы реализовать новый модуль в своем приложении.
Теперь я нахожусь в точке, где я интегрируюсь со сторонней библиотекой Java, и застрял при работе с этим методом:
public Email addAttachment(String name, InputStream file) throws IOException {
this.attachments.put(name, file);
return this;
}
То, что у меня есть в моем API, - это тело, возвращенное из HTTP-сообщения WS
, которое является Enumerator[Array[Byte]]
.
Мне интересно, как написать Iteratee
, который обрабатывал бы куски Array[Bytes]
и создавал InputStream
для использования в этом методе.
(Боковая панель): Существуют другие версии метода addAttachment
, которые принимают java.io.File
, однако я хочу избежать записи на диск в этой операции и, скорее, иметь дело с потоками.
Я попытался начать с написания чего-то вроде этого:
Iteratee.foreach[Array[Byte]] { bytes =>
???
}
Однако я не уверен, как взаимодействовать с java InputStream
здесь. Однако я нашел что-то, называемое ByteArrayInputStream
, которое принимает весь Array[Byte]
в своем конструкторе, что я не уверен, что работаю в этом сценарии, когда я работаю с кусками?
Мне, вероятно, нужна помощь Java здесь!
Спасибо за любую помощь заранее.
Ответы
Ответ 1
Если я буду следовать за вами, я думаю, вы хотите работать с PipedInputStream и PipedOutputStream:
https://docs.oracle.com/javase/8/docs/api/java/io/PipedInputStream.html
Вы всегда используете их в парах. Вы можете построить пару так:
PipedInputStream in = new PipedInputStream(); //can also specify a buffer size
PipedOutputStream out = new PipedOutputSream(in);
Передайте входной поток в API, а в своем собственном коде итерации через ваши патроны и напишите свои байты.
Единственное предостережение в том, что вам нужно читать/писать в отдельных потоках. В вашем случае это, вероятно, хорошо, чтобы выполнить повторение/запись в отдельном потоке. Я уверен, что вы можете справиться с ней в Scala лучше меня, в Java это будет что-то вроде:
PipedInputStream in = new PipedInputStream(); //can also specify a buffer size
PipedOutputStream out = new PipedOutputSream(out);
new Thread(() -> {
// do your looping in here, write to 'out'
out.close();
}).run();
email.addAttachment(in);
email.send();
in.close();
(для ясности исключая обработку исключений и обработку ресурсов)