Closeable和AutoCloseable有什么区别?
source link: https://my.oschina.net/lishangzhi/blog/5021095
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
导读:我们知道,在java中jvm虚拟机会自动去调用gc(垃圾回收器)去回收堆中没有被引用的对象,至于什么时候回收,是不确定的,同时有些是用到其他资源,jvm也不会进行回收,类似Io流中的FileInputStream使用到了硬盘资源,垃圾回收器是不会去回收的,因此,必须手动关闭掉。我们进行手动的编写close()方法进行关闭,然而,每次这些写会造成代码冗余不优雅,JDK中对于释放资源有Closeable和AutoCloseable可以使用,以下为详解。、
Closeable
Closeable源码
使用close需要注意
在java.io.包下 InputStream,outputStream, Reader, Writer 等基类都实现了Closeable接口,因为每次的IO操作结束之后都要去释放资源。
- 如果在调用此方法之前 stream已经关闭 ,则方法失效;
- 建议先关闭内部的资源,并标记为已关闭;
- 优先抛出IO异常;
AutoCloseable
AutoCloseable接口位于java.lang包下,从JDK1.7开始引入。
由于位于java.lang包下,可以针对于所有实现该接口的流,而closable本身也实现了该接口,java的io流间接性的可以自动关闭接口,也就是说从jdk1.7开始,不需要手动去关流。
AutoCloseable源码
{try}-with-resources的使用注意
在1.7之前,我们通过try{} finally{} 在finally中释放资源。
- 在finally中关闭资源存在以下问题:
- 自己要手动写代码做关闭的逻辑;
- 有时候还会忘记关闭一些资源;
- 关闭代码的逻辑比较冗长,不应该是正常的业务逻辑需要关注的;
很显然是很繁琐的。jdk1.7之后采用{try}-with-resources的解释
将可能抛出异常的代码块放入到try块中,在try结束的时候,会自动将这些资源关闭(调用close方法)。
{try}-with-resources关键点
带资源的try语句的3个关键点:
- 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。
- 在try代码中声明的资源被隐式声明为final。
- 通过使用分号分隔每个声明可以管理多个资源。
这样看起来是不是简单,舒服很多
© 著作权归作者所有
其他人还在看
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK