如何将OutputStream转换为InputStream?
我处于开发阶段,我有两个模块,从一个输出为OutputStream
,另一个输出为InputStream
。 你知道如何将OutputStream
转换为InputStream
(反之亦然,我的意思是这样),我将能够连接这两部分?
谢谢
OutputStream
是你写数据的地方。 如果某个模块公开一个OutputStream
,则期望在另一端读取某些内容。
另一方面,暴露InputStream
事情表明您需要监听这个流,并且会有可读的数据。
所以可以将InputStream
连接到OutputStream
InputStream----read---> intermediateBytes[n] ----write----> OutputStream
正如有人提到的,这是IOUtils的copy()
方法可以让你做的事情。 以其他方式走向没有任何意义......希望这是有道理的
更新:
当然,我越想到这一点,我越能看到这实际上是一个需求。 我知道一些评论提到Piped
输入/输出流,但还有另一种可能性。
如果公开的输出流是ByteArrayOutputStream
,则可以通过调用toByteArray()
方法获取全部内容。 然后,您可以使用ByteArrayInputStream
子类创建输入流包装。 这两个是伪流,它们都基本上只是包装一个字节数组。 因此,以这种方式使用流在技术上是可行的,但对我来说,它仍然很奇怪......
似乎有很多链接和其他类似的东西,但没有使用管道的实际代码。 使用java.io.PipedInputStream
和java.io.PipedOutputStream
的优点是没有额外的内存消耗。 ByteArrayOutputStream.toByteArray()
返回原始缓冲区的一个副本,这意味着无论你在内存中有什么,你现在都有两个副本。 然后写入InputStream
意味着您现在有三份数据。
代码:
// take the copy of the stream and re-write it to an InputStream
PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
new Thread(new Runnable() {
public void run () {
try {
// write the original OutputStream to the PipedOutputStream
originalByteArrayOutputStream.writeTo(out);
} catch (IOException e) {
// logging and exception handling should go here
}
}
}).start();
此代码假定originalByteArrayOutputStream
是ByteArrayOutputStream
因为它通常是唯一可用的输出流,除非您正在写入文件。 我希望这有帮助! 关于这一点的好处是,因为它是在一个单独的线程中,它也是并行工作的,所以无论是否使用输入流,都会从您的旧输出流中流出。 这是有益的,因为缓冲区可以保持较小,并且延迟更少,内存使用量更少。
你将需要一个中间类,它将缓冲之间。 每次调用InputStream.read(byte[]...)
,缓冲类将使用从OutputStream.write(byte[]...)
传入的下一个块填充传入的字节数组。 由于块的大小可能不相同,因此适配器类将需要存储一定的数量,直到它具有足够的空间来填充读取缓冲区和/或能够存储任何缓冲区溢出。
本文对此问题的几种不同方法进行了详细分析:
http://blog.ostermiller.org/convert-java-outputstream-inputstream
链接地址: http://www.djcxy.com/p/78375.html