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

时间:2015-01-18 14:48:11

标签: java scala playframework io iterate

我一直在读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帮助!

感谢您提前提供任何帮助。

1 个答案:

答案 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();

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