java - 从 OutputStream 创建 InputStream 的最有效方法

标签 java io stream inputstream bytearrayoutputstream

本页: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/

相关文章:

java - Glassfish 上的纯 Java 应用程序?

java - 如何使用 jackson 以不同方式序列化同一实体的相同属性

java - 检查自定义对象列表是否具有相同的 Java 8 属性值

java - 我的文件读取器方法从文件中读取数组列表有什么问题

c++ - 在其他类中声明的私有(private)成员

java - 当我在查询中的任何地方放置 * 时,Hibernate 在查询中出现错误

c++ - MessageBox 产生与 Cout C++ 不同的输出

c - 在 Unix 上使用 C 从文件描述符读取/写入 N 个字节

java - 未分配变量的 PrintWriter 在使用后会关闭吗?

C++ wstringstream << NULL