在工作遇到一种情况,需要对同一文件数据进行多次重复读取,我们都知道流像一个管道一样,数据一旦流过去,就无法被再次使用。例如我需要对同一张电子发票,通过定位多次读取相关信息。
在工作中还遇到问题:需要对读入的文件 (MultipartFile) 计算 MD5,同时又需要将其上传到 S3上,即需要对同一输入流进行多次重复读取操作,但是按照流本身所代表的抽象含义,数据一旦流过去,就无法被再次使用。这里给出三种解决的方法:
1. 将输入流转换为文件
这种方式最容易想到,既然需要多次使用,就可以将流转为文件,写入磁盘中,需要的时候再从磁盘读取文件,缺点在于从磁盘写入和读取较为耗时。代码如下:
public void useInputStreamTwiceBySaveToDisk(InputStream inputStream) {
// 文件存放的路径
String desPath = "test001.bin";
try (BufferedInputStream is = new BufferedInputStream(inputStream);
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(desPath))) {
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
} catch (IOException e) {