摘要:如下面的,定義成局部變量可以不用,局部變量可以等同于,但定義成成員變量就必須是用修飾的,不然會編譯錯誤。雖然簡化了,但感覺還是沒有什么質的變化,實際用途我們可能不希望關心資源的關閉,或者在方法結束之后如果是局部變量它就能自動關閉。
做Java開發的都知道,每個資源的打開都需要對應的關閉操作,不然就會使資源一直占用而造成資源浪費,從而降低系統性能。
關于資源的關閉操作,從JDK7-JDK9有了不少的提升及簡化。
JDK6在JDK6及之前,每個資源都需要我們手動寫代碼關閉,如:
FileInputStream fis = null; byte[] buffer = new byte[1024]; try { fis = new FileInputStream(new File("E:Java技術棧.txt")); while (fis.read(buffer) > 0) { System.out.println(new String(buffer)); } } catch (Exception e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
資源打開使用完后,必須在finally塊中進行手動關閉!我們有的同事,做一個查詢功能點,打開了連接查詢完后沒有手動關閉,最后造成連接池超出最大連接數而使系統功能堵塞。
JDK7JDK7發布后,添加了新特性:try-with-resources語句。所有需要關閉的資源只要實現了java.lang.AutoCloseable(java.io.Closeable就實現了這個接口)接口就在會程序結束后自動關閉。
如上面的讀取文件的流程序用JDK7來寫:
byte[] buffer = new byte[1024]; try (FileInputStream fis = new FileInputStream(new File("E:Java技術棧.txt"))) { while (fis.read(buffer) > 0) { System.out.println(new String(buffer)); } } catch (Exception e) { e.printStackTrace(); }
所有的資源在try()里面定義,并去掉了finally模塊。
下面我們來寫一個自定義的流來看看是否自動關閉了。
定義一個自定義輸入輸出流
class MyInputStream implements AutoCloseable { void read(String content) { System.out.println("read content " + content); } @Override public void close() throws Exception { System.out.println("input stream is closed."); } } class MyOutputStream implements AutoCloseable { void write(String content) { System.out.println("write content " + content); } @Override public void close() throws Exception { System.out.println("out stream is closed."); } }
單個資源自動關閉
try (MyInputStream mis = new MyInputStream()) { mis.read("7_2"); } catch (Exception e) { e.printStackTrace(); }
輸出:
read content 7_2
input stream is closed.
多個資源自動關閉
try()里面可以定義多個資源,它們的關閉順序是最后在try()定義的資源先關閉。
try (MyInputStream mis = new MyInputStream(); MyOutputStream mos = new MyOutputStream()) { mis.read("7_3"); mos.write("7_3"); } catch (Exception e) { e.printStackTrace(); }
輸出:
read content 7_3JDK9
write content 7_3
out stream is closed.
input stream is closed.
JDK9發布后,又簡化了try-with-resources語句的用法。
try()里面可以是一個變量,但必須是final的或者等同final才行。如下面的mis,mos定義成局部變量可以不用final,局部變量可以等同于final,但定義成成員變量就必須是用final修飾的,不然會編譯錯誤。
MyInputStream mis = new MyInputStream(); MyOutputStream mos = new MyOutputStream(); try (mis; mos) { mis.read("1.9"); mos.write("1.9"); } catch (Exception e) { e.printStackTrace(); }
輸出:
read content 1.9
write content 1.9
out stream is closed.
input stream is closed.
再來看個例子:
Connection dbCon = DriverManager.getConnection("url", "user", "password"); try (dbCon; ResultSet rs = dbCon.createStatement().executeQuery("select * from emp")) { while (rs.next()) { System.out.println("In loadDataFromDB() =====>>>>>>>>>>>> " + rs.getString(1)); } } catch (SQLException e) { System.out.println("Exception occurs while reading the data from DB ->" + e.getMessage()); }
dbCon和rs都能被自動關閉。
JKD9雖然簡化了,但感覺還是沒有什么質的變化,實際用途我們可能不希望關心資源的關閉,或者在方法結束之后如果是局部變量它就能自動關閉。或許是我站的高度不夠,官方有其他的考量,但JDK9的這一點變化還是非常有用的。
更多JDK9的新功能實戰陸續更新,如果覺得有用,分享到朋友圈給更多的人吧!
推薦:成為架構師的十階段學習資料
推薦:Spring Boot & Cloud 最強技術教程
推薦:分享一套高級Java筆試題(實拍高清圖)
如果對你有用,歡迎分享到朋友圈
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71374.html
以下是Java技術棧微信公眾號發布的關于 Java 的技術干貨,從以下幾個方面匯總。 Java 基礎篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎篇 8張圖帶你輕松溫習 Java 知識 Java父類強制轉換子類原則 一張圖搞清楚 Java 異常機制 通用唯一標識碼UUID的介紹及使用 字符串...
摘要:最近連都在準備發布的路上了,大家都整明白了嗎也許現在大部分人還在用,的新特性都沒用熟,剛出不久,就不用說了。 最近連 JDK11都在準備發布的路上了,大家都整明白了嗎?也許現在大部分人還在用6-8,8的新特性都沒用熟,9剛出不久,10-11就不用說了。 為了大家對JDK有一個全面的了解,下面我為大家整理了JDK5~10的所有關鍵新特性! JDK5新特性 自動裝箱與拆箱 枚舉 靜態導...
摘要:的新特性在的后邊可以增加一個在括號中可以定義流對象那么這個流對象的作用域就在中有效中的代碼執行完畢會自動把流對象釋放不用寫格式定義流對象定義流對象可能會產出異常的代碼異常類變量變量名異常的處理邏輯創建一個字節輸入流對象構造方法中綁定要讀取的 package com.itheima.demo06.trycatch; import java.io.FileInputStream;impor...
摘要:概述是一個主要版本的發布這里介紹的是對的特性和增強的實現是的增強提案,包括增強建議和路線圖流程規范請求,描述了針對平臺的建議和最終規范主要變更統一模塊化標準這是全新的編程組件模塊,是可命名的可自描述的代碼和數據集合。 概述 java9是一個主要版本的發布 這里介紹的是Oracle對JDK9的特性和增強的實現 JEP是JDK的增強提案,包括增強建議和路線圖流程 JSR(Java規范請...
摘要:的新特性接口接口接口里邊增加了一個靜態的方法可以給集合一次性添加多個元素使用前提當集合中存儲的元素的個數已經確定了不在改變時使用注意方法只適用于接口接口接口不適用于接接口的實現類方法的返回值是一個不能改變的集合集合不能再使用方法添加元素會拋 package com.itheima.demo04.JDK9; import java.util.List;import java.util.M...
閱讀 1734·2021-10-18 13:34
閱讀 3922·2021-09-08 10:42
閱讀 1566·2021-09-02 09:56
閱讀 1618·2019-08-30 15:54
閱讀 3140·2019-08-29 18:44
閱讀 3311·2019-08-26 18:37
閱讀 2227·2019-08-26 12:13
閱讀 466·2019-08-26 10:20