扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Java中怎么将OutputStream 转换成InputStream,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
专注于为中小企业提供网站建设、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业札达免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
一、使用byte array缓存转换
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
这种方式最为简单,但是要求执行baos.toByteArray()
这个方法之前,需要的数据已经完全写入,即无法做到边写边读,另外其需要足够的内存来一次性的容纳这些数据。
二、使用Pipes
PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(out); } } ).start(); class2.processDataFromInputStream(in);
顾名思义,pipe即为管道,这种方法支持流式的方式,一端写一端读,向PipedOutputStream写入的数据可以从PipedInputStream读出,很好的解决了方法一中的短处,是个人较为推荐的一种方式。
注意:
PipedInputStream
中存储数据的数组大小默认为1024,且使用过程中不可扩充,当一次性写入的数据超过这个数,则会有个AssertionError
抛出。当然,我们可以在初始化PipedInputStream
的时候进行设置。
上述代码仅为pipe的一种使用的方式,其也可以初始化如下:
PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out);
两种方式等价。
三、使用Circular Buffers
作为PipedInputStream
和PipedOutputStream
的一种替代方式,CircularBuffer
有着更为简单的数据结构和使用方法,但是其并不是JDK自带的类需要额外引入。
org.ostermiller utils 1.07.00
CircularByteBuffer cbb = new CircularByteBuffer(); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(cbb.getOutputStream()); } } ).start(); class2.processDataFromInputStream(cbb.getInputStream());
如上,CircularByteBuffer
将InputStream
和OutputStream
作为其属性,相对于方法二使用更为简化,且更易理解。
注意:
方法二和方法三使用类似,但是其不建议再同一个线程中处理OutputStram
和InputStream
,以为容易造成死锁的问题
方法二和方法三中,当数组满的时候,需要等待消费,造成block,所以建议使用者初始化的时候根据使用情况来定义初始容量。
看完上述内容,你们掌握Java中怎么将OutputStream 转换成InputStream的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流