天天看點

Closeable和AutoCloseable有什麼差別?

首發位址:Closeable和AutoCloseable有什麼差別?

導讀:我們知道,在java中jvm虛拟機會自動去調用gc(垃圾回收器)去回收堆中沒有被引用的對象,至于什麼時候回收,是不确定的,同時有些是用到其他資源,jvm也不會進行回收,類似Io流中的FileInputStream使用到了硬碟資源,垃圾回收器是不會去回收的,是以,必須手動關閉掉。我們進行手動的編寫close()方法進行關閉,然而,每次這些寫會造成代碼備援不優雅,JDK中對于釋放資源有Closeable和AutoCloseable可以使用,以下為詳解。

Closeable

Closeable源碼

Closeable和AutoCloseable有什麼差別?

使用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中關閉資源存在以下問題:
  • 自己要手動寫代碼做關閉的邏輯;
  • 有時候還會忘記關閉一些資源;
  • 關閉代碼的邏輯比較冗長,不應該是正常的業務邏輯需要關注的;
Closeable和AutoCloseable有什麼差別?

很顯然是很繁瑣的。jdk1.7之後采用{try}-with-resources的解釋

将可能抛出異常的代碼塊放入到try塊中,在try結束的時候,會自動将這些資源關閉(調用close方法)。

{try}-with-resources關鍵點

帶資源的try語句的3個關鍵點:

  • 由帶資源的try語句管理的資源必須是實作了AutoCloseable接口的類的對象。
  • 在try代碼中聲明的資源被隐式聲明為final。
  • 通過使用分号分隔每個聲明可以管理多個資源。
Closeable和AutoCloseable有什麼差別?

這樣看起來是不是簡單,舒服很多