Java 9增強的自動資源管理

2021-01-13 逆向開發

在學習《Java try catch finally語句》一節後我們可以發現,當程序使用 finally 塊關閉資源時,程序會顯得異常臃腫,例如以下代碼。

public static void main(String[] args) {    FileInputStream fis = null;    try {        fis = new FileInputStream("a.txt");    } catch (FileNotFoundException e) {        e.printStackTrace();    } finally {                if (fis != null) {            try {                fis.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

Java 7 以前,上面程序中的 finally 代碼塊是不得不寫的「臃腫代碼」,為了解決這種問題,Java 7 增加了一個新特性,該特性提供了另外一種管理資源的方式,這種方式能自動關閉文件,被稱為自動資源管理(Automatic Resource Management)。該特性是在 try 語句上的擴展,主要釋放不再需要的文件或其他資源。


自動資源管理替代了 finally 代碼塊,並優化了代碼結構和提高程序可讀性。語法如下:

try (聲明或初始化資源語句) {    } catch(Throwable e1){    } catch(Throwable e2){    } catch(Throwable eN){    }

當 try 代碼塊結束時,自動釋放資源。不再需要顯式的調用 close() 方法,該形式也稱為「帶資源的 try 語句」。


注意:

try 語句中聲明的資源被隱式聲明為 final,資源的作用局限於帶資源的 try 語句。

可以在一條 try 語句中聲明或初始化多個資源,每個資源以;隔開即可。

需要關閉的資源必須實現了 AutoCloseable 或 Closeable 接口。

Closeable 是 AutoCloseable 的子接口,Closeable 接口裡的 close() 方法聲明拋出了 IOException,因此它的實現類在實現 close() 方法時只能聲明拋出 IOException 或其子類;AutoCloseable 接口裡的 close() 方法聲明拋出了 Exception,因此它的實現類在實現 close() 方法時可以聲明拋出任何異常。

下面示範如何使用自動關閉資源的 try 語句。

public class AutoCloseTest {    public static void main(String[] args) throws IOException {        try (                                                BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));                PrintStream ps = new PrintStream(new FileOutputStream("a.txt"))) {                        System.out.println(br.readLine());            ps.println("C語言中文網");        }    }}

上面程序中粗體字代碼分別聲明、初始化了兩個 IO 流,BufferedReader 和 PrintStream 都實現了 Closeable 接口,並在 try 語句中進行了聲明和初始化,所以 try 語句會自動關閉它們。


自動關閉資源的 try 語句相當於包含了隱式的 finally 塊(這個 finally 塊用於關閉資源),因此這個 try 語句可以既沒有 catch 塊,也沒有 finally 塊。

Java 7 幾乎把所有的「資源類」(包括文件 IO 的各種類、JDBC 編程的 Connection 和 Statement 等接口)進行了改寫,改寫後的資源類都實現了 AutoCloseable 或 Closeable 接口。

如果程序需要,自動關閉資源的 try 語句後也可以帶多個 catch 塊和一個 finally 塊。

Java 9 再次增強了這種 try 語句。Java 9 不要求在 try 後的圓括號內聲明並創建資源,只需要自動關閉的資源有 final 修飾或者是有效的 final (effectively final),Java 9 允許將資源變量放在 try 後的圓括號內。上面程序在 Java 9 中可改寫為如下形式。

public class AutoCloseTest {    public static void main(String[] args) throws IOException {                final BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));                final PrintStream ps = new PrintStream(new FileOutputStream("a. txt"));                try (br; ps) {                        System.out.println(br.readLine());            ps.println("C語言中文網");        }    }}


相關焦點

  • java編程中'為了性能'一些儘量做到的地方
    下面是參考網絡資源和總結一些在java編程中儘可能做到的一些地方 - 1.儘量在合適的場合使用單例 使用單例可以減輕加載的負擔,縮短加載的時間,提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面 第一,控制資源的使用,通過線程同步來控制資源的並發訪問
  • 全國2018年10月自考人力資源管理(一)考試真題
    全國2018年10月高等教育自學考試人力資源管理(一)試題課程代碼:00147選擇題部分一、單項選擇題:本大題共25小題,每小題1分,共25分。在每小題列出的備選項中只有一項是最符合題目要求的,請將其選出。
  • 今天的挑戰是,人力資源管理與戰略的高效契合
    導讀:數位化時代,組織在變化,人也在變化,人力資源的調整速度甚至要比組織行為學的調整速度還要快。這種快速調整來源於人力資源必須與企業戰略匹配。然而現實中讓人最憂慮的是,很多企業開始使用數位化技術,卻繼續採用傳統的管理邏輯。
  • 程式設計師:java使用線程池和TCP實現簡單多輪聊天系統
    代碼實現服務端package com.tcp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import
  • java_security_calendar_2019(day5-day8)
    簡介java_security_calendar_2019第5天-第8天的部份。分別為Dos(StringBuilder)、Dos(readAllBytes)、權限提升、未授權下載。Day5示例代碼:import javax.servlet.http.HttpServletRequest;import java.util.Enumeration;publicclassRequest{publicstatic String toString(HttpServletRequest req){ StringBuilder sb = new
  • 你了解java中的幾種編碼方式?解決亂碼問題可能並不麻煩
    由於之前就知道String中的轉換方式,還有一些工具類,因此今天就好好的整理一下java中jdk提供的幾種轉換方式,希望對你有幫助。一、編碼轉換原理1、為什麼需要編碼我們知道計算機存儲信息的最小單位是一個字節8位,能夠表示256個字符。這對於早起的英文來說足夠了。即使是加上一些常見符號也足夠。
  • 全國2014年4月高等教育自學考試人力資源管理(一)試題
    1.一定範圍內的所有人員的總和為A.人力資源 B.人口資源C.人才資源 D.人力資本2.關注公平就業機會的人力資源管理模式被稱為A.產業模式 B.投資模式C.參與模式 D.高靈活性模式3.公平理論又稱社會比較理論,其提出者是A.泰羅 B.弗魯姆C.阿德福 D.亞當斯
  • 如何處理Java中出現的異常?這九種方式值得一試!
    下面列出了 9 個比較重要的處理方式,可以幫你上手或者提升你的異常處理能力。  1、清理 Finally 塊中的資源,或使用 Try-With-Resource 語句  在 try 塊中使用資源時常發生,比如 InputStream ,是需要在用完之後關掉的。一個通常發生的錯誤是,在 try 塊的末尾關掉資源:
  • 江西省森林資源管理工作會議在南昌召開
    國家林業和草原局政府網12月2日訊  11月22日至23日,江西省林業局在南昌召開全省森林資源管理工作會議。江西省林業局黨組成員、副局長嚴成出席會議並講話。江西省林業局總工程師倪修平主持會議並作總結講話。
  • 深圳人力資源管理師機會在你手中
    人力資源管理比較偏文科性質,靠理解記憶的多,而且考試時也不需要考數學等高難度科目。人力資源管理專業培養具備管理、經濟、法律及人力資源管理等方面的知識抄和能力,能在事業單位及政府部門從事人力資襲源管理以及教學、科研方面工作的工商管理學科專門人才。
  • 人力資源管理筆記第五章
    人力資源管理筆記第五章     第一節人員招募    一、人員招募的形式    人員招募,是指尋找職工的可能來源和吸引他們到企業應徵的過程。
  • 重慶成智人力資源管理有限公司
    重慶成智人力資源管理有限公司(原:重慶鑫橋勞務輸出有限公司),成立15年來,始終秉承「守法經營、誠信立足、創新致遠」的經營理念,公司的各項工作受到上級監管部門、客戶單位、公司員工和社會各界的肯定。  一、公司經歷了從成立時年輸出不到100人發展到現在年輸出和管理員工在3000人以上。主要做法:  一是從3個人送起。
  • 2018年4月自考人力資源開發與管理真題_備考指導自考_自考報名...
    人力資源管理的開發功能主要體現在人力資源管理工作中的是A.人力資源規劃 B.工作分析、招聘C.薪酬及其考核制度 D.培訓、工作指導3. 第一次真正有統地對各項工作進行科學分析的人是A. 蘇 格 拉 底 B. 歐 文C.泰 勒 D.吉爾布雷斯4. 企業文化的核心是A.企業價值觀 B.
  • 《中華人民共和國資源稅法》將於2020年9月1日起施行
    《中華人民共和國資源稅法》將於2020年9月1日起施行 2020-08-30 16:56:23 來源:人民網 日前,記者從國家稅務總局獲悉,《中華人民共和國資源稅法》將於2020年9月1日起施行,這是落實稅收法定原則和完善地方稅體系的重要舉措
  • 浙江嵊州政協委員:加強普通建築用砂石資源管理
    「砂石資源的短缺將增加基礎建設工程的成本,致使施工工期延長,如何破解這個難題,我一直在思考。」日前,嵊州市政協委員、嵊州市機關事務服務中心副主任、臺屬聯誼會副會長呂巖圍繞砂石資源供需矛盾,進行了調研走訪。近年來,嵊州市工程建設開展得如火如荼,所取得的成績有目共睹。
  • 嵊州市砂石土類礦產資源管理工作推進會召開
    8月18日上午,嵊州市砂石土類礦產資源管理工作推進會召開,總結前階段摸排情況,並對下階段工作作出部署。會前,還組織相關人員赴鹿山街道、浦口街道,對非法砂場(堆料場)、室內加工點進行現場查看。會議指出,自7月13日全市礦石資源整治動員大會以來,嵊州市礦管辦正式運行,嵊州市各相關部門積極配合,宣傳發動,礦石資源整治行動全力展開,順利完成了第一階段的摸排工作,已發現違規點位51處。下一步將從抓好已確定問題點位的整改,強化「五聯單」管理,規範涉礦工程管理,交投集團加快砂石產能銷售布點,規範高鐵臨時加工點管理,繼續做好發動宣傳等6個方面工作。
  • 數字驅動創新 我愛我家著力推進人力資源管理升級
    「推進智能化、平臺化、移動化辦公,加強我愛我家人力資源管理的數位化轉型,通過完整的頂層框架和強大的系統能力,支撐人力資源創新改革,持續探索新技術賦能人力資源管理的新機遇。」近日,我愛我家控股集團人力資源信息化總監田利針對上述「新現象」給出了答案。2019作為我愛我家「數位化轉型」的爆發元年,也是董事長兼總裁謝勇主導下的集團戰略思想全面升級的集中表現。
  • 新一代Java web報表工具—Smartbi電子表格的優勢
    Smartbi電子表格還有移動APP、用戶管理、計劃任務、元數據管理、參數管理、轉換規則、數據權限等功能。總結Smartbi電子表格是一款創新的java報表工具,具有以下特點:1.
  • 「重大出生缺陷大數據云平臺總體建設與數據資源管理應用項目」軟...
    「重大出生缺陷大數據云平臺總體建設與數據資源管理應用項目」軟硬體採購招標公告 公告信息: 採購項目名稱 「重大出生缺陷大數據云平臺總體建設與數據資源管理應用項目」軟硬體採購 品目 貨物/通用設備/計算機設備及軟體/計算機設備/伺服器
  • 幹部是組織的第一戰略資源,幹部管理:如何走出十個誤區
    無獨有偶,9月13日,剛剛上市的小米也發出內部郵件,雷軍宣布小米最新組織架構調整和人事任命:新設集團組織部和參謀部,其中組織部將負責中高層管理幹部的聘用、升遷、培訓和考核激勵。組織和參謀部的設立也符合雷軍說的:「沒有老兵,沒有傳承。沒有新軍,沒有未來。讓每一個有能力、有抱負、有衝勁、敢擔當的年輕人,都能在戰爭中學習戰鬥,在戰鬥中快速成長。」