12. InputStream重复使用小技巧
约 239 字小于 1 分钟
在日常的编码中,有时会遇到,需要重复获取InputStream中的数据的需求;然后一般的流,只能读一次,读完就没了;那么如果我希望有一个可以重复读取数据的InputStream,可以怎么操作?
/**
* 转换为字节数组输入流,可以重复消费流中数据
*
* @param inputStream
* @return
* @throws IOException
*/
public static ByteArrayInputStream toByteArrayInputStream(InputStream inputStream) throws IOException {
if (inputStream instanceof ByteArrayInputStream) {
return (ByteArrayInputStream) inputStream;
}
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
BufferedInputStream br = new BufferedInputStream(inputStream);
byte[] b = new byte[1024];
for (int c; (c = br.read(b)) != -1; ) {
bos.write(b, 0, c);
}
// 主动告知回收
b = null;
br.close();
inputStream.close();
return new ByteArrayInputStream(bos.toByteArray());
}
}
实现方式基本就是将InputStream中的数据读取,写入到一个临时的输出流,然后再封装为ByteArrayInputStream
即可
当我们使用时,如果需要重复消费流中数据,手动调用java.io.ByteArrayInputStream#reset
Loading...