释放模式-JDK7以后带资源的try构造

在一个长时间运行的程序中,若是未能关闭一个流,则可能会泄露文件句柄,网络端口和其余资源。所以在JDK6和更早的版本中,明智的作法实在 finally块中关闭流。为了获得正确的变量做用域,必须在try块以外声明流变量,但必须在try内完成初始化。在关闭流以前,须要检查流变量是否为 null。最后一般都但愿忽略流关闭时出现的异常。或者最多把这些异常记录在日志中。例如:
java

     /**
     * jdk7以前的流操做以及关闭关闭
     */
    public void beforeSeven(){
        OutputStream os = null;
        try{
            os = new FileOutputStream("/opt/temp/data");
            //对os流的相应操做
        }catch(IOException ex){
            System.out.println(ex.getMessage());
        }finally{
            if(os!=null)
            try{
                os.close();
            }catch(IOException e){
                //忽略
            }

 }
    }
网络

这个技术有时会称做释放模式,者须要在垃圾回收前释放对象是很常见的。这个技术不单单适用于流,同时还适用于socket,通道,JDBC链接和语句中。
socket


JDK7引入了“带资源的try'” 构造(try with resource),能够更简介的完成清理,不须要在try块以外声明流变量,彻底能够在try块的一个参数列表中声明,例如:
ide

/**
     * jdk7以后的流操做以及关闭
     */
    public void afterSereven(){
        try(OutputStream os = new FileOutputStream("/opt/temp/data")){
            //处理流输出
        }catch(IOException ex){
            System.out.println(ex.getMessage());
        }
    }

代码变的如此简介。如今再也不须要finally子句。Java会对try块参数表中声明的全部AutoCloseable对象自动调用close()方法。spa


只要对象实现了closeable接口,均可以实现try with resource构造,着包括几乎全部须要释放的对象。到目前为止,JavaMail Transport对象是目前惟一的例外。日志

相关文章
相关标签/搜索