前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Closeable和AutoCloseable有什么区别?

Closeable和AutoCloseable有什么区别?

原创
作者头像
码农架构
修改2021-04-16 09:48:02
5330
修改2021-04-16 09:48:02
举报
文章被收录于专栏:码农架构码农架构

首发地址:Closeable和AutoCloseable有什么区别?

导读:我们知道,在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。
  • 通过使用分号分隔每个声明可以管理多个资源。
图片
图片

这样看起来是不是简单,舒服很多

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Closeable
    • Closeable源码
      • 使用close需要注意
      • AutoCloseable
        • {try}-with-resources的使用注意
          • {try}-with-resources关键点
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com