1. 程式人生 > >java9系列第二篇-資源自動關閉的語法增強

java9系列第二篇-資源自動關閉的語法增強

![file](https://img2020.cnblogs.com/other/1815316/202010/1815316-20201015071901792-2057976050.png) 我計劃在後續的一段時間內,寫一系列關於java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關注。期待您能關注我,我將把java 9 寫成一系列的文章,大概十篇左右。 * [java9第一篇-可以在interface中定義私有方法了](http://www.zimug.com/java/java9-%e5%8f%af%e4%bb%a5%e5%9c%a8interface%e4%b8%ad%e5%ae%9a%e4%b9%89%e7%a7%81%e6%9c%89%e6%96%b9%e6%b3%95%e4%ba%86/.html) 在Java 9的版本中,對從JDK 7開始支援的try-with-resources語法進行了改進。雖然只是一個小小的改進,我仍希望把他介紹給你,我們一起來每天進步一點點。 ## 一、先說Java7的try-with-resources(Java9改進版在後文) 在Java 7之前沒有`try-with-resources`語法,所有的流的銷燬動作,全都需要自己在finally方法中手動的寫程式碼進行關閉。如下文中的程式碼,將一個字串寫入到一個檔案裡面。 ~~~ @Test void testStream() throws IOException { String fileName = "D:\\data\\test\\testStream.txt"; FileOutputStream fos = new FileOutputStream(fileName); //建立IO管道流 OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); try{ bw.write("手寫程式碼進行Stream流的關閉"); bw.flush(); }finally{ bw.close(); //手動關閉IO管道流 osw.close(); fos.close(); } } ~~~ 從Java 7版本開始提供了`try-with-resources`語法,我們只需要把管道流用`try()`包含起來,在try程式碼段執行完成之後,IO管道流就會自動的關閉,不需要我們手寫程式碼去關閉,這很簡潔! ~~~ @Test void testTry() throws IOException { String fileName = "D:\\data\\test\\testTry.txt"; try(FileOutputStream fos = new FileOutputStream(fileName); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw);){ bw.write("IO管道流被自動呼叫close()方法"); bw.flush(); } } ~~~ ## 二、避免走入誤區 很多小夥伴在知道`try-with-resources`語法之後,容易陷入誤區 * 誤區一:只有IO管道流才能使用`try-with-resources`語法,進行自動的資源關閉 * 誤區二:所有帶有close()方法的類物件,都會自動的呼叫close()方法進行資源關閉 誤區一把實踐範圍縮小了,而誤區二把實踐範圍誇大了。**那麼什麼樣的資源可以被自動關閉呢?答案就是實現了AutoCloseable或Closeable介面的類可以自動的進行資源關閉。** ~~~ public interface Closeable extends AutoCloseable { public void close() throws IOException; } ~~~ Closeable介面繼承自AutoCloseable介面,二者都包含close()方法。如果你自定義的佔用系統資源的類需要進行資源回收,請實現這兩個介面之一,並在close()方法中進行資源回收與關閉。這樣你自定義的類,也可以使用`try-with-resources`語法進行資源回收與關閉。 ## 三、`try-with-resources`在Java 9中的改進 `try-with-resources`語法在java 9 中進行了改進,`try-with-resources`語法的`try()`可以包含變數,多個變數用分號隔開。 這樣的改進目的是讓語義更加明確,將資源建立程式碼與嘗試資源回收的語法分離。 * 語義一:嘗試去執行程式碼段,如果丟擲異常,對異常進行處理 * 語義二:嘗試去自動關閉資源,關閉誰?關閉被`try()`包含的變數 ~~~ @Test void testJava9Try() throws IOException { String fileName = "D:\\data\\test\\testJava9Try.txt"; FileOutputStream fos = new FileOutputStream(fileName); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); try(bw;osw;fos){ //注意這裡:嘗試去回收這三個物件對應的資源,和上文中的java 7程式碼對比 bw.write("Java9-可以被自動呼叫close()方法"); bw.flush(); } } ~~~ ## 歡迎關注我的部落格,裡面有很多精品合集 * 本文轉載註明出處(必須帶連線,不能只轉文字):[字母哥部落格](http://www.zimug.com)。 **覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力!** 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。 * [《手摸手教你學Spring Boot2.0》]( https://www.kancloud.cn/hanxt/springboot2/content ) * [《Spring Security-JWT-OAuth2一本通》](https://www.kancloud.cn/hanxt/springsecurity/content) * [《實戰前後端分離RBAC許可權管理系統》](https://www.kancloud.cn/hanxt/vue-spring/content) * [《實戰SpringCloud微服務從青銅到王者》](https://www.kancloud.cn/hanxt/springcloud/content) * [《VUE深入淺出系列》](https://www.kancloud.cn/hanxt/vuejs2/