静态代码扫描中Java资源对象关闭的探究

本文探讨了静态代码扫描中Java资源对象关闭的各种情况,包括正确的关闭方式、套接资源的关闭、方法中return资源对象时的处理、无需关闭的资源对象类型,以及数据库连接和socket对象的关闭规则。重点解析了try-with-resources、套接流的自动关闭以及特定资源对象如ByteArrayInputStream的关闭行为。
摘要由CSDN通过智能技术生成

本人在探究静态代码扫描中资源对象关闭规则遇到了一些疑惑,本文将这些疑惑记录下来并逐一找出解答。
包括在哪些情况下,这些资源对象需要手动关闭,怎么正确的关闭,哪些情况下不需要手动关闭,以及为什么。
资源对象包括很多种,本文重点关注输入输出流对象和数据库连接对象。

一、正确的关闭资源对象的写法

  • 第一种写法:
public static void main(String[] args) throws Exception{
    FileOutputStream fileOutputStream = null;
    BufferedOutputStream bufferedOutputStream=null;
    DataOutputStream out=null;
    byte[] data1 = "1这个例子测试文件写".getBytes("GB2312");
    try {
        fileOutputStream = new FileOutputStream("E:\\A.txt");
        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        out = new DataOutputStream(bufferedOutputStream);
        out.write(data1);
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        if (out!=null) {
            out.close();
        }
    }
}

在finally 中进行关闭可以保证在程序运行出现异常的情况下,资源对象仍然会被正常关闭。

  • 第二种写法:
public static void main(String[] args) throws Exception{
    byte[] data1 = "这个例子测试文件写".getBytes("GB2312");
    try (
            FileOutputStream fileOutputStream = new FileOutputStream("E:\\A.txt");
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            DataOutputStream out = new DataOutputStream(bufferedOutputStream)
            )
    {       
        out.write(data1);
    } catch (Exception e) {
        // TODO: handle exception
    }
}

从Java1.7开始,支持了try-with-resources写法,即将资源对象声明的过程放在try()的括号里面,这样java在资源对象使用完成之后会自动关闭。详情请见官方文档

  • 第三种写法:
import org.apache.commons.io.IOUtils;
public static void main(String[] args) throws Exception{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值