我一直在读Iteratees&枚举器,以便在我的应用程序中实现一个新模块。
我现在正处于与第三方Java库集成的地步,并坚持使用这种方法:
public Email addAttachment(String name, InputStream file) throws IOException {
this.attachments.put(name, file);
return this;
}
我的API中包含的WS
HTTP调用返回的正文是Enumerator[Array[Byte]]
。
我现在想知道如何编写一个Iteratee
来处理Array[Bytes]
的块并创建一个InputStream
来使用此方法。
(侧栏):addAttachment
方法的其他版本采用java.io.File
但是我想避免在此操作中写入磁盘,而是宁愿处理流。
我试着写下这样的东西:
Iteratee.foreach[Array[Byte]] { bytes =>
???
}
但是我不确定如何在这里与java InputStream
进行交互。我找到了一个名为ByteArrayInputStream
的东西,然而它在构造函数中占用了整个Array[Byte]
,我不确定在这种情况下是否可以使用,因为我正在使用块?
我可能需要一些Java帮助!
感谢您提前提供任何帮助。
答案 0 :(得分:3)
如果我关注你,我想你想使用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,并在您自己的代码中迭代您的chuck并写下您的字节。
唯一需要注意的是,您需要在单独的线程中读/写。在你的情况下,在单独的线程中进行迭代/写入可能是好的。我确信你可以在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();
(为清晰起见,省略了异常处理和资源处理)