Java中三种方法重复使用同一输入流

本文探讨了在Java中如何处理需要多次读取同一输入流的情况。介绍了将输入流转换为文件、转化为数据以及利用BufferedInputStream的标记与重置功能的三种方法。总结了每种方法的优缺点,对于大文件推荐使用磁盘存储,小文件可考虑内存存储,同时强调尽量避免重复使用输入流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在工作遇到一种情况,需要对同一文件数据进行多次重复读取,我们都知道流像一个管道一样,数据一旦流过去,就无法被再次使用。例如我需要对同一张电子发票,通过定位多次读取相关信息。

         在工作中还遇到问题:需要对读入的文件 (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) { 
          
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值