从枚举器[Array [Byte]]创建Java InputStream

gor*_*lph 11 java io scala playframework iterate

为了在我的应用程序中实现一个新模块,我一直在阅读Iteratees和Enumerators上的很多内容.

我现在正处于与第三方Java库集成的地步,并坚持使用此方法:

public Email addAttachment(String name, InputStream file) throws IOException {
    this.attachments.put(name, file);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

我在我的API中拥有的是从WSHTTP调用返回的正文Enumerator[Array[Byte]].

我现在想知道如何编写一个Iteratee可以处理这个方法的块Array[Bytes]并创建一个InputStream.

(侧栏):该addAttachment方法还有其他版本,java.io.File但我希望避免在此操作中写入磁盘,而是宁愿处理流.

我试着从写这样的东西开始:

Iteratee.foreach[Array[Byte]] { bytes =>
    ???
}
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何在InputStream这里与java进行交互.我找到了一个叫做a的东西,ByteArrayInputStream但它Array[Byte]在构造函数中占据了整体,我不确定在这个场景中是否可以工作,因为我正在使用块?

我可能需要一些Java帮助!

在此先感谢您的帮助.

rom*_*afe 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);
Run Code Online (Sandbox Code Playgroud)

将输入流传递给 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();
Run Code Online (Sandbox Code Playgroud)

(为了清楚起见,省略异常处理和资源处理)