ByteArrayStream需要关闭的问题

项目场景:

在项目中需要把生成出来的二维码图片放到OSS中,所以要进行流处理


问题描述

在代码中,使用了ByteArrayStream流,使用了GPT的代码优化,忘记关流了。但是GPT提示不需要关掉。代码如下。

public static void saveQRcode(QRcodeDTO qrCode) {
        String jsonString = JSON.toJSONString(qrCode);
        BufferedImage image = GenerateQRUtil.generateQRCode(jsonString, 700);
        if (image == null) {
            throw new RuntimeException("Failed to generate QR code image");
        }
        //这里的字节输入输出流不用手动去关掉
        try (ByteArrayOutputStream imageByteArrayOutputStream = new ByteArrayOutputStream()) {
            ImageIO.write(image, "png", imageByteArrayOutputStream);
            ByteArrayInputStream inputStream = new ByteArrayInputStream(imageByteArrayOutputStream.toByteArray());
            AliOSSUtils.uploadImage("QRCode.png", inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

可以看到,一个流用了try with Resource 关闭,另一个流不做处理。


原因分析:

那么是否需要关掉ByteArrayStream流呢?

上传时先用ByteArrayOutputStream来暂存image的流。编程有个好的意识是用完流要及时关闭,就思考ByteArrayOutputStream要不要关。

在下面有个inputStream的流是给OSS上传用的,但是优化过后的代码并没有关闭流。

答案是关不关都行,ByteArrayOutputStream的close方法是空实现,ByteArrayOutputStream是基于内存的流,而不是指向硬盘或者网络,用完了就被GC清理掉。


解决方案:

答案是关不关都行

ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。

可以看到,它的close()方法是空实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值