InputStream只能单向读取一次,并且不支持reset()和mark(int),所以要想复用InputStream的话最好就是先存在一个地方。这里可以选择通过ByteArrayOutputStream存储。
1. 将InputStream转换成ByteArrayOutputStream
//将InputStream转换成ByteArrayOutputStream
private static ByteArrayOutputStream copyStream(InputStream in) throws IOException {
ByteArrayOutputStream out =new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len;
while((len=in.read(buffer))>-1){
out.write(buffer,0,len);
}
out.flush();
in.close();
return out;
}
2. 将ByteArrayOutputStream转成ByteArrayInputStream
//ByteArrayOutputStream转成ByteArrayInputStream
ByteArrayInputStream byteIn=new ByteArrayInputStream(out.toByteArray());
这样在ByteArrayInputStream使用过一次之后,就可以通过reset()重新回到顶部(因为ByteArrayInputStream重写了**reset()和mark(int)**方法),然后就可以再读一次啦。
因为ByteArrayInputStream是InputStream的子类,所以同样可以把它当成流来使用,不过是支持重复使用罢了。
比如:
3. 多次复用
String inStr= convertInputStream2String(ind);
byteIn.reset();
String inStr2= convertInputStream2String(ind);
其中convertInputStream2String(InputStream is)方法:
public static String convertInputStream2String(InputStream is){
StringBuilder sb=new StringBuilder();
String line=null;
try(BufferedReader br=new BufferedReader(new InputStreamReader(is))){
while((line=br.readLine())!=null){
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}