zoukankan      html  css  js  c++  java
  • java中如何将OutputStream转换为InputStream

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

    如果你曾经使用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());
    

      

  • 相关阅读:
    【Web__Cookie】常规使用
    【MVC__ExceptionFilter】全局异常处理
    【 自定义友好错误页 】
    【前端__iframe】web页面框架的使用相关
    【JS__UEditor】富文本编辑器的使用
    简单五子棋,没有电脑AI
    C# 打印倒三角
    C# 抽象类
    递归算法输出数列的前N个数
    case when then else end 累加
  • 原文地址:https://www.cnblogs.com/xiohao/p/5073832.html
Copyright © 2011-2022 走看看