outputStream转inputStream

2022-09-06  本文已影响0人  King斌

方法一:使用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读出,很好的解决了方法一中的短处,是个人较为推荐的一种方式。

注意

PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);

两种方式等价。

方法三:使用Circular Buffers

作为PipedInputStreamPipedOutputStream的一种替代方式,CircularBuffer有着更为简单的数据结构和使用方法,但是其并不是JDK自带的类需要额外引入

<!-- https://mvnrepository.com/artifact/org.ostermiller/utils -->
<dependency>    
     <groupId>org.ostermiller</groupId>
    <artifactId>utils</artifactId>
   <version>1.07.00</version>
</dependency>

其使用代码示例如下

CircularByteBuffer cbb = new CircularByteBuffer();
new Thread(
  new Runnable(){
    public void run(){
      class1.putDataOnOutputStream(cbb.getOutputStream());
    }
  }).start();
class2.processDataFromInputStream(cbb.getInputStream());

如上,CircularByteBufferInputStreamOutputStream作为其属性,相对于方法二使用更为简化,且更易理解。

注意

借鉴

上一篇 下一篇

猜你喜欢

热点阅读