本页:http://blog.ostermiller.org/convert-java-outputstream-inputstream介绍如何从OutputStream创建InputStream:
new ByteArrayInputStream(out.toByteArray())
其他的替代方案是使用PipedStreams和新的线程,这很麻烦。
我不喜欢将许多兆字节复制到新的内存字节数组的想法。有没有比这更有效的库呢?
编辑:
根据劳伦斯·贡萨尔维斯的建议,我尝试了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))
发布于 2016-05-01 08:25:20
避免复制缓冲区的一个简单解决方案是创建一个特殊用途的ByteArrayOutputStream
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上的输入流。认为输出流在该点之后是关闭的。
发布于 2016-11-28 21:19:46
我通常尽量避免创建单独的线程,因为死锁的可能性增加了,理解代码的难度增加了,以及处理异常的问题也增加了。
下面是我提出的解决方案:通过重复调用produceChunk()来创建分块内容的ProducerInputStream:
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);
}
https://stackoverflow.com/questions/1225909
复制相似问题