这是一篇关于讲解如何重复读取inputStream的示例,希望通过此,大家都能轻松上手。


业务场景

 获取到一个inputStream后,可能要多次利用它进行read的操作。

由于流读取过一次就不能再读了,InputStream对象本身不能复制,且它也没有实现Cloneable接口。

实现思路

1、先把InputStream转换成ByteArrayOutputStream

2、后面要使用InputStream对象时,再从ByteArrayOutputStream转化回来

代码Demo

package com.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class StreamOperateUtil {
public static void main(String[] args) throws FileNotFoundException {

InputStream input = new FileInputStream("c:\\test.txt");
//InputStream input = httpconn.getInputStream(); //这里可以写你获取到的流

ByteArrayOutputStream baos = cloneInputStream(input);

// 打开两个新的输入流
InputStream stream1 = new ByteArrayInputStream(baos.toByteArray());
InputStream stream2 = new ByteArrayInputStream(baos.toByteArray());

}

private static ByteArrayOutputStream cloneInputStream(InputStream input) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
return baos;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

}

备注:这种适用于一些不是很大的流,因为缓存流是会消耗内存的。

InputStream为什么不能被重复读取?

首先,熟悉Java的人可能都知道,Java中的Inputstream是不能重复读取的。 

但是有没有想过,InputStream为什么不能重复读呢? 

其实要回答“为什么”这个问题很简单,就是人家接口就是这么设计的,不能重复读。 

所以今天要讨论的问题更像是:Java的InputStream为什么要设计为不能重复读? 

关于InputStream为什么不能重复读取,网上也各有说法: 

有的同学说: 

“InputStream就类比成一个杯子,杯子里的水就像InputStream里的数据,你把杯子里的水拿出来了,杯子的水就没有了,InputStream也是同样的道理。” 

比喻的非常好,让我们从直观上认识了InputStream为什么不能重复被读。 

也有的同学从更深的代码角度去分析: 

“在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会重置。” 

说的也有道理,就是说InputStream的读取是单向的。但是并不是所有的InputStream实现类都是这样的实现方式。

说明:本文示例语言是​​JAVA​​…