这一页:http://blog.ostermiller.org/convert-java-outputstream-inputstream描述如何从OutputStream创建InputStream:
new ByteArrayInputStream(out.toByteArray())
其他替代方案是使用 PipedStreams 和新线程,这很麻烦。
我不喜欢将许多兆字节复制到内存字节数组中的新想法。
有没有一个图书馆可以更有效地做到这一点?
EDIT:
根据 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(消费者)的代码。 )要么在同一个线程中交替,要么在两个单独的线程中并发操作。让它们在同一个线程中运行可能比使用两个单独的线程要复杂得多,更容易出错(您需要确保消费者never阻塞等待输入,否则实际上会死锁),并且需要让生产者和消费者在同一个循环中运行,这看起来耦合得太紧密了。
所以使用第二个线程。其实没那么复杂。您链接到的页面有合理的示例。这是一个有点现代化的版本,它也关闭了流:
try (PipedInputStream in = new PipedInputStream()) {
new Thread(() -> {
try (PipedOutputStream out = new PipedOutputStream(in)) {
writeDataToOutputStream(out);
} catch (IOException iox) {
// handle IOExceptions
}
}).start();
processDataFromInputStream(in);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)