在实际的工作当中,某些场合下我们常常会需要多次读取一个InputStream的需求,比如:从流中提取文本、文档格式转换、文件复制移动等。
但InputStream具有不可重复使用的特性,如果第一次使用后就关闭了流,第二次使用就会报出java.io.IOException: Stream Closed的异常,如果第一次使用没有关闭流,第二次使用的时候读取到的字节数就是0,因为在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会进行重置。
本文是对InputStream进行重复使用提供一种方案,先将InputStream缓存到一个ByteArrayOutputStream中,用的时候进行转换获取InputStream,用完后进行销毁。
**注意:**此种解决方案有一个缺点就是会存在内存压力,需要在时间和空间之间找到一个平衡点。
创建缓存工具类
package com.frame.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 流操作过程中处理流的多次消费问题
* @author LXW
* @date 2020/6/15 20:33
*/
public class InputStreamCache {
private static final Logger logger = LoggerFactory.getLogger(InputStreamCache.class);
/**
* 将InputStream中的字节保存到ByteArrayOutputStream中。
*/
private ByteArrayOutputStream byteArrayOutputStream;
private InputStream inputStream;
public InputStreamCache(InputStream inputStream) {
if (inputStream == null) return;
this.inputStream = inputStream;
initCache();
}
/**
* 初始化
*/
private void initCache(){
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
try