博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中如何将OutputStream转换为InputStream
阅读量:7038 次
发布时间:2019-06-28

本文共 1466 字,大约阅读时间需要 4 分钟。

在不需要文件生成的情况下,直接将输出流转换成输入流。可使用下面的三种方法:

如果你曾经使用java IO,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要从输入流读取数据的类。

  你很快会被问道,“java中如何将OutputStream转换为InputStream?”

  方法一:使用字节数组缓存数据
  最简单的方法是用字节数组缓存数据。代码

  ByteArrayOutputStream out = new ByteArrayOutputStream();  class1.putDataOnOutputStream(out);  class2.processDataFromInputStream(  new ByteArrayInputStream(out.toByteArray())  );

  

  于是,OutputStream就被转换为InputStream了。
  方法二:使用管道
  第一种方法的问题是你必须有足够的内存缓存所有数据。你可以使用文件系统缓存更多数据,但无论如何可处理数据的大小还是受到限制。
  解决方法是创建一个线程产生数据到PipedOutputStream。当前线程可从中读取数据。

  PipedInputStream in = new PipedInputStream();  PipedOUtputStream out = new PipedOutputStream(in);  new Thread(  new Runnable(){  public void run(){  class1.putDataOnOutputStream(out);  }  }  ).start();  class2.processDataFromInputStream(in);|||

  

  方法三:使用循环缓存区
  方法二中的两个管道流,实际上管理着一个隐藏的循环缓存区。使用一个显式的循环缓存区更易于理解。CircularBuffers 有如下优点
  一个CircularBuffers类而不是两个管道类。
  较于缓存所有数据和额外线程的方法更容易使用。
  你可以更改缓存大小而不必受限于管道缓存区1K的固定缓存大小。
    

  多线程情形:  CircularByteBuffer cbb = new CircularByteBuffer();  new Thread(  new Runnable(){  public void run(){  class1.putDataOnOutputStream(cbb.getOutputStream());  }  }  ).start();  class2.processDataFromInputStream(cbb.getInputStream());  单线程情形  // buffer all data in a circular buffer of infinite size  CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);  class1.putDataOnOutputStream(cbb.getOutputStream());  class2.processDataFromInputStream(cbb.getInputStream());

  

转载地址:http://hcnal.baihongyu.com/

你可能感兴趣的文章
Lync Server 2010 安装部署系列三:添加DNS记录
查看>>
centos5.5vsftpd安装总结
查看>>
C#中类的继承问题02
查看>>
MySQL基本操作
查看>>
为virtualbox 建立桥接网络
查看>>
通过组策略设置---允许普通用户能够关闭服务器
查看>>
Word 2003高级技巧之可爱的锚标记
查看>>
Phabricator 配置ssh访问代码仓库
查看>>
AWStats: Apache/IIS的日志分析工具
查看>>
Freebsd系统升级
查看>>
使用DPM2007备份还原Exchange2007邮箱数据库
查看>>
云MongoDB网络安全策略和权限管理体系
查看>>
[CTO札记]招聘出题
查看>>
企业网络及应用层安全防护技术精要(Part I)
查看>>
新瓶装旧酒的苹果,是否回走30年前的老路
查看>>
Rafy 领域实体框架 - 树型实体功能(自关联表)
查看>>
java中使用junit测试
查看>>
flex游戏编程性能优化
查看>>
美国诚实签经验——是不是户籍和常住作业地在一起?是不是有居住证?明白居住证信息吗?英语超卓,应变能力强,有幽默感 10分...
查看>>
VC++速记
查看>>