gpt4 book ai didi

java - 从 Enumerator[Array[Byte]] 创建 Java InputStream

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:50 27 4
gpt4 key购买 nike

为了在我的应用程序中实现一个新模块,我阅读了很多关于 Iteratees 和 Enumerators 的文章。

我现在正处于与第 3 方 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] 的 block 并创建一个 InputStream 以在这种方法。

(边栏):还有其他版本的 addAttachment 方法采用 java.io.File 但是我想避免写入磁盘这个操作,而宁愿处理流。

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

Iteratee.foreach[Array[Byte]] { bytes =>
???
}

但是我不确定如何与此处的 java InputStream 进行交互。我找到了一个叫做 ByteArrayInputStream 的东西然而,这会在其构造函数中占用整个 Array[Byte],我不确定它是否适用于这种情况,因为我正在处理 block ?

我可能需要一些 Java 帮助!

提前感谢您的帮助。

最佳答案

如果我关注你,我想你想使用 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();

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

关于java - 从 Enumerator[Array[Byte]] 创建 Java InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com