首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从OutputStream创建InputStream的最有效方法

从OutputStream创建InputStream的最有效方法
EN

Stack Overflow用户
提问于 2009-08-04 06:13:12
回答 2查看 104.4K关注 0票数 91

本页:http://blog.ostermiller.org/convert-java-outputstream-inputstream介绍如何从OutputStream创建InputStream:

代码语言:javascript
复制
new ByteArrayInputStream(out.toByteArray())

其他的替代方案是使用PipedStreams和新的线程,这很麻烦。

我不喜欢将许多兆字节复制到新的内存字节数组的想法。有没有比这更有效的库呢?

编辑:

根据劳伦斯·贡萨尔维斯的建议,我尝试了PipedStreams,结果发现他们并不是那么难对付。以下是clojure中的示例代码:

代码语言:javascript
复制
(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))
EN

回答 2

Stack Overflow用户

发布于 2016-05-01 08:25:20

避免复制缓冲区的一个简单解决方案是创建一个特殊用途的ByteArrayOutputStream

代码语言:javascript
复制
public class CopyStream extends ByteArrayOutputStream {
    public CopyStream(int size) { super(size); }

    /**
     * Get an input stream based on the contents of this output stream.
     * Do not use the output stream after calling this method.
     * @return an {@link InputStream}
     */
    public InputStream toInputStream() {
        return new ByteArrayInputStream(this.buf, 0, this.count);
    }
}

根据需要写入上述输出流,然后调用toInputStream获取底层buffer上的输入流。认为输出流在该点之后是关闭的。

票数 11
EN

Stack Overflow用户

发布于 2016-11-28 21:19:46

我通常尽量避免创建单独的线程,因为死锁的可能性增加了,理解代码的难度增加了,以及处理异常的问题也增加了。

下面是我提出的解决方案:通过重复调用produceChunk()来创建分块内容的ProducerInputStream:

代码语言:javascript
复制
public abstract class ProducerInputStream extends InputStream {

    private ByteArrayInputStream bin = new ByteArrayInputStream(new byte[0]);
    private ByteArrayOutputStream bout = new ByteArrayOutputStream();

    @Override
    public int read() throws IOException {
        int result = bin.read();
        while ((result == -1) && newChunk()) {
            result = bin.read();
        }
        return result;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int result = bin.read(b, off, len);
        while ((result == -1) && newChunk()) {
            result = bin.read(b, off, len);
        }
        return result;
    }

    private boolean newChunk() {
        bout.reset();
        produceChunk(bout);
        bin = new ByteArrayInputStream(bout.toByteArray());
        return (bout.size() > 0);
    }

    public abstract void produceChunk(OutputStream out);

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1225909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档