如何关闭流和对象文件

最近在项目中,代码质量整改时做的,full gc扫描,回收不用的资源文件。总结了一下和jdk版本有关

  1. 版本是jdk1.6 (如果有多个,最先创建的最后关,最后创建的最先关)
    在 JDK 7 之前,你一定要牢记在 finally 中执行 close 以释放资源
    https://blog.csdn.net/guxianyang/article/details/78304142
    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭。
InputStream in = null;
try {
    in = acquireStream();
    ...
} finally {
    if (in != null) in.close();
}


在上述代码中,流的关闭是放在try中的,但是我们都知道流资源的关闭尽量要放在finally块中,因为如果try中代码执行失败,流没有被正确关闭就造成资源浪费。
首先关闭资源放在try块里一定会有问题:资源可能不被关闭。
所以资源的关闭应该放在finally里,这没有什么疑问。
至于finally块里close资源会额外引入IOE,这也是无法避免的。
目前(就我见到过的)绝大多数代码里,捕获IOE后,最多打一条log,更多的是noop,即no operations,do nothing。
close的时候IOE发生的几率很小,它应该属于一种操作系统层面的error,选择忽略它是正确的选择,毕竟你的系统不能因为一个资源关闭错误而停止运行。况且,如果你硬要捕获这个IOE,那能做些什么呢

2.版本是jdk 1.7
JDK 7 中的 try-with-resources 介绍
try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。
https://www.cnblogs.com/hk-zsg/p/11557431.html
代码:
例如,我们自定义一个资源类

public class Demo {    
    public static void main(String[] args) {
        try(Resource res = new Resource()) {  //  try
            res.doSome();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

class Resource implements AutoCloseable {  // 实现接口AutoCloseable
    void doSome() {
        System.out.println("do something");
    }
    @Override
    public void close() throws Exception {
        System.out.println("resource is closed");
    }
}

执行输出如下:

do something
resource is closed

步骤1定义接口实现AutoCloseable接口
步骤2,把资源放在try里面

3 try-with-resources 在 JDK 9 中的改进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值