本页:http://blog.ostermiller.org/convert-java-outputstream-inputstream 描述了如何从 OutputStream 创建一个 InputStream:
new ByteArrayInputStream(out.toByteArray())
其他替代方法是使用 PipedStreams 和新线程,这很麻烦。
我不喜欢将许多兆字节复制到内存中的新字节数组的想法。 有没有比这更有效的库?
编辑:
根据 Laurence Gonsalves 的建议,我尝试了 PipedStreams,结果证明它们并不难处理。 这是clojure中的示例代码:
(defn #^PipedInputStream create-pdf-stream [pdf-info]
(let [in-stream (new PipedInputStream)
out-stream (PipedOutputStream. in-stream)]
(.start (Thread. #(;Here you write into out-stream)))
in-stream))
最佳答案
如果您不想一次将所有数据复制到内存缓冲区中,那么您将必须拥有使用 OutputStream(生产者)的代码和使用 InputStream 的代码(消费者)要么在同一个线程中交替,要么在两个单独的线程中同时操作。让它们在同一个线程中运行可能比使用两个单独的线程要复杂得多,更容易出错(您需要确保使用者 从不 阻塞等待输入,或者您ll 有效地死锁)并且需要让生产者和消费者在同一个循环中运行,这看起来耦合得太紧了。
所以使用第二个线程。真的没那么复杂。您链接到的页面有合理的例子。这是一个有点现代化的版本,它也关闭了流:
try (PipedInputStream in = new PipedInputStream()) {
new Thread(() -> {
try (PipedOutputStream out = new PipedOutputStream(in)) {
writeDataToOutputStream(out);
} catch (IOException iox) {
// handle IOExceptions
}
}).start();
processDataFromInputStream(in);
}
关于java - 从 OutputStream 创建 InputStream 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1225909/