解决InputStream流无法重复使用的问题

文章讲述了在处理通过InputStream上传文件的需求中遇到的问题,发现流在使用后会变为空,通过将流转换为byte[]并重新创建InputStream来解决问题。同时讨论了这种方法在文件较大时的局限性,留待后续优化。
摘要由CSDN通过智能技术生成

一.需求

现在有个需求,要通过InputStream流先去判断文件类型,然后再上传文件,这样就会用到两次InputStream。

二.问题

这个功能之前的同事已经做了一版,一直以为是正常的,毕竟都很久了,但是我用的时候发现上传的文件总是空的,只能去仔细看下代码了。

三.排查

try (InputStream in = inputStream) {
            //检验文件
            CheckFileUtil.checkFile(inputStream, FileUtil.extName(filename));
            LoggerFactory.getLogger(this.getClass()).info("上传文件的文件名="+filename);
            //上传文件
            String filePathURL = saveToDisk(in, FileUtil.extName(filename));

            FileInfo fileInfo = new FileInfo();
            fileInfo.setId(RandomUtil.simpleUUID());
            fileInfo.setFileName(filename);
            fileInfo.setFileType(FileUtil.extName(filename));

之前的代码逻辑是用原来的inputStream去校验,然后用赋值后的in去上传文件,开始看到这里也没发现有什么问题,感觉很正常。

只能去加日志,打断点调试了,最终发现在校验文件之后,不管是inputStream还是in都是空的了,恍然大悟。由于流读过一次就不能再读了。

四.解决

开始想着去复制一遍这个流就行了,查了下才知道不行,InputStream对象本身不能复制,它也没有实现Cloneable接口。

那就先用byte[]去存储,然后用的时候在转换。调整后的代码

public static byte[] readInputStreamToByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, bytesRead);
        }
        return byteArrayOutputStream.toByteArray();
    }

    @Override
    public FileInfo upload(String filename, Long size, InputStream inputStream) {
        try (InputStream in = inputStream) {
            byte[] bytes = readInputStreamToByteArray(in);
            //检验文件
            CheckFileUtil.checkFile(new ByteArrayInputStream(bytes), FileUtil.extName(filename));
            LoggerFactory.getLogger(this.getClass()).info("上传文件的文件名="+filename);
            //上传文件
            String filePathUrl = saveToDisk(new ByteArrayInputStream(bytes), FileUtil.extName(filename));

但是这种明显只适用于文件不大的时候,不知道如果文件较大的情况下,该怎么进一步优化,先记录下,后面遇到了再补充

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红烧柯基

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值