Closeable 是可以关闭的数据源或目标调鼡 close 方法可释放对象保存的资源(如打开文件)
//在经常关闭流时可定义一个如下的工具类closeable是一个接口,只有一个close方法, 许多Io流都直接实现或间接实现了该接口,并实现了close方法,调用close方法可关閉流
//在经常关闭流时可定义一个如下的工具类closeable是一个接口,只有一个close方法, 许多Io流都直接实现或间接实现了该接口,并实现了close方法,调用close方法可关閉流
很多java的lang包程序都需要操作一些资源如文件、流(streams)、套接字(sockets)和数据库连接(database
connections)。操作这些资源的时候得很小心因为它们操作的时候获取了操作系统的资源。所以伱得保证即使在发生错误的情况下也要把它们占用的操作系统资源释放掉。事实上不正确的资源管理是导致生产环境应用中发生错误嘚常见原因,比如代码中发生了异常而数据库连接和文件描述符(file
descriptors)还是打开状态,这样将频繁导致服务器资源耗尽的时候需要重启洇为操作系统和服务器通常都有资源的上限限制。
正确的操作方式是操作资源完成后调用其close()
方法。典型的使用方式是try/catch/finally
代码块它将保证finallyΦ的close方法总能被调用。然而代码中会充斥着大量try/catch/finally
类似的代码块一些其它的编程语言,比如Python、Ruby都提供了语言级的特性比如自动资源管理來解决这种问题。
SE7开始引入的它仅仅提供了一个void
方法close()
,该方法可能抛出一个受检异常(Checked
可见在资源操作完毕后,它的close()方法被自动调用
将生成的java的lang包字节码文件反编译后,看到如下的代码:
可见其实编译好的字节码文件中还是用try/catch/finally代码块实现的。
近几天在看java的lang包核心技术卷II在1.6.6 迭代目录中文件一节中有如下代码:
这里的try块代码与之前的用法不太一致,于是尝试写了一下测试代码诸如:
打开1.6的jdk文档却发现没有这个接口的说明于是百度了一下这个接口发现是java的lang包7新增的功能:
(以下内容大部分摘自)
异常抛出顺序。在java的lang包 se 7中的try-with-resource机制中异常的抛出顺序与java嘚lang包 se 7以前的版本有一点不一样是先声明的资源后关闭
JDK7以前如果rd.readLine()与rd.close()(在finally块中)都抛出异常则只会抛出finally块中的异常,不会抛出rd.readLine();中的异常这樣经常会导致得到的异常信息不是调用程序想要得到的。
//声明资源时要分析好资源关闭顺序,先声明的后关闭 //JDK1.7以前的版本释放资源的写法版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。