Создание 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();

(для ясности исключая обработку исключений и обработку ресурсов)