在一个长时间运行的程序中,若是未能关闭一个流,则可能会泄露文件句柄,网络端口和其余资源。所以在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对象是目前惟一的例外。日志