成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JDK9新特性實(shí)戰(zhàn):簡(jiǎn)化流關(guān)閉新姿勢(shì)。

dailybird / 539人閱讀

摘要:如下面的,定義成局部變量可以不用,局部變量可以等同于,但定義成成員變量就必須是用修飾的,不然會(huì)編譯錯(cuò)誤。雖然簡(jiǎn)化了,但感覺(jué)還是沒(méi)有什么質(zhì)的變化,實(shí)際用途我們可能不希望關(guān)心資源的關(guān)閉,或者在方法結(jié)束之后如果是局部變量它就能自動(dòng)關(guān)閉。

做Java開(kāi)發(fā)的都知道,每個(gè)資源的打開(kāi)都需要對(duì)應(yīng)的關(guān)閉操作,不然就會(huì)使資源一直占用而造成資源浪費(fèi),從而降低系統(tǒng)性能。

關(guān)于資源的關(guān)閉操作,從JDK7-JDK9有了不少的提升及簡(jiǎn)化。

JDK6

在JDK6及之前,每個(gè)資源都需要我們手動(dòng)寫(xiě)代碼關(guān)閉,如:

FileInputStream fis = null;
byte[] buffer = new byte[1024];
try {
    fis = new FileInputStream(new File("E:Java技術(shù)棧.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();
        }
    }
}

資源打開(kāi)使用完后,必須在finally塊中進(jìn)行手動(dòng)關(guān)閉!我們有的同事,做一個(gè)查詢(xún)功能點(diǎn),打開(kāi)了連接查詢(xún)完后沒(méi)有手動(dòng)關(guān)閉,最后造成連接池超出最大連接數(shù)而使系統(tǒng)功能堵塞。

JDK7

JDK7發(fā)布后,添加了新特性:try-with-resources語(yǔ)句。所有需要關(guān)閉的資源只要實(shí)現(xiàn)了java.lang.AutoCloseable(java.io.Closeable就實(shí)現(xiàn)了這個(gè)接口)接口就在會(huì)程序結(jié)束后自動(dòng)關(guān)閉。

如上面的讀取文件的流程序用JDK7來(lái)寫(xiě):

byte[] buffer = new byte[1024];
try (FileInputStream fis = new FileInputStream(new File("E:Java技術(shù)棧.txt"))) {
    while (fis.read(buffer) > 0) {
        System.out.println(new String(buffer));
    }
} catch (Exception e) {
    e.printStackTrace();
}

所有的資源在try()里面定義,并去掉了finally模塊。

下面我們來(lái)寫(xiě)一個(gè)自定義的流來(lái)看看是否自動(dòng)關(guān)閉了。

定義一個(gè)自定義輸入輸出流

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.");
    }

}

單個(gè)資源自動(dòng)關(guān)閉

try (MyInputStream mis = new MyInputStream()) {
    mis.read("7_2");
} catch (Exception e) {
    e.printStackTrace();
}

輸出:

read content 7_2
input stream is closed.

多個(gè)資源自動(dòng)關(guān)閉

try()里面可以定義多個(gè)資源,它們的關(guān)閉順序是最后在try()定義的資源先關(guān)閉。

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_3
write content 7_3
out stream is closed.
input stream is closed.
JDK9

JDK9發(fā)布后,又簡(jiǎn)化了try-with-resources語(yǔ)句的用法。

try()里面可以是一個(gè)變量,但必須是final的或者等同final才行。如下面的mis,mos定義成局部變量可以不用final,局部變量可以等同于final,但定義成成員變量就必須是用final修飾的,不然會(huì)編譯錯(cuò)誤。

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.

再來(lái)看個(gè)例子:

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都能被自動(dòng)關(guān)閉。

JKD9雖然簡(jiǎn)化了,但感覺(jué)還是沒(méi)有什么質(zhì)的變化,實(shí)際用途我們可能不希望關(guān)心資源的關(guān)閉,或者在方法結(jié)束之后如果是局部變量它就能自動(dòng)關(guān)閉。或許是我站的高度不夠,官方有其他的考量,但JDK9的這一點(diǎn)變化還是非常有用的。

更多JDK9的新功能實(shí)戰(zhàn)陸續(xù)更新,如果覺(jué)得有用,分享到朋友圈給更多的人吧!

推薦:成為架構(gòu)師的十階段學(xué)習(xí)資料

推薦:Spring Boot & Cloud 最強(qiáng)技術(shù)教程

推薦:分享一套高級(jí)Java筆試題(實(shí)拍高清圖)

如果對(duì)你有用,歡迎分享到朋友圈

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71374.html

相關(guān)文章

  • Java核心技術(shù)教程整理,長(zhǎng)期更

    以下是Java技術(shù)棧微信公眾號(hào)發(fā)布的關(guān)于 Java 的技術(shù)干貨,從以下幾個(gè)方面匯總。 Java 基礎(chǔ)篇 Java 集合篇 Java 多線(xiàn)程篇 Java JVM篇 Java 進(jìn)階篇 Java 新特性篇 Java 工具篇 Java 書(shū)籍篇 Java基礎(chǔ)篇 8張圖帶你輕松溫習(xí) Java 知識(shí) Java父類(lèi)強(qiáng)制轉(zhuǎn)換子類(lèi)原則 一張圖搞清楚 Java 異常機(jī)制 通用唯一標(biāo)識(shí)碼UUID的介紹及使用 字符串...

    Anchorer 評(píng)論0 收藏0
  • JDK 5 ~ 10 特性傾情整理!

    摘要:最近連都在準(zhǔn)備發(fā)布的路上了,大家都整明白了嗎也許現(xiàn)在大部分人還在用,的新特性都沒(méi)用熟,剛出不久,就不用說(shuō)了。 最近連 JDK11都在準(zhǔn)備發(fā)布的路上了,大家都整明白了嗎?也許現(xiàn)在大部分人還在用6-8,8的新特性都沒(méi)用熟,9剛出不久,10-11就不用說(shuō)了。 為了大家對(duì)JDK有一個(gè)全面的了解,下面我為大家整理了JDK5~10的所有關(guān)鍵新特性! JDK5新特性 自動(dòng)裝箱與拆箱 枚舉 靜態(tài)導(dǎo)...

    godiscoder 評(píng)論0 收藏0
  • IO字符9jdk7和jdk9的異常的處理

    摘要:的新特性在的后邊可以增加一個(gè)在括號(hào)中可以定義流對(duì)象那么這個(gè)流對(duì)象的作用域就在中有效中的代碼執(zhí)行完畢會(huì)自動(dòng)把流對(duì)象釋放不用寫(xiě)格式定義流對(duì)象定義流對(duì)象可能會(huì)產(chǎn)出異常的代碼異常類(lèi)變量變量名異常的處理邏輯創(chuàng)建一個(gè)字節(jié)輸入流對(duì)象構(gòu)造方法中綁定要讀取的 package com.itheima.demo06.trycatch; import java.io.FileInputStream;impor...

    Hancock_Xu 評(píng)論0 收藏0
  • JDK 9 變更一覽

    摘要:概述是一個(gè)主要版本的發(fā)布這里介紹的是對(duì)的特性和增強(qiáng)的實(shí)現(xiàn)是的增強(qiáng)提案,包括增強(qiáng)建議和路線(xiàn)圖流程規(guī)范請(qǐng)求,描述了針對(duì)平臺(tái)的建議和最終規(guī)范主要變更統(tǒng)一模塊化標(biāo)準(zhǔn)這是全新的編程組件模塊,是可命名的可自描述的代碼和數(shù)據(jù)集合。 概述 java9是一個(gè)主要版本的發(fā)布 這里介紹的是Oracle對(duì)JDK9的特性和增強(qiáng)的實(shí)現(xiàn) JEP是JDK的增強(qiáng)提案,包括增強(qiáng)建議和路線(xiàn)圖流程 JSR(Java規(guī)范請(qǐng)...

    sherlock221 評(píng)論0 收藏0
  • JDK9特性,List的listof方法

    摘要:的新特性接口接口接口里邊增加了一個(gè)靜態(tài)的方法可以給集合一次性添加多個(gè)元素使用前提當(dāng)集合中存儲(chǔ)的元素的個(gè)數(shù)已經(jīng)確定了不在改變時(shí)使用注意方法只適用于接口接口接口不適用于接接口的實(shí)現(xiàn)類(lèi)方法的返回值是一個(gè)不能改變的集合集合不能再使用方法添加元素會(huì)拋 package com.itheima.demo04.JDK9; import java.util.List;import java.util.M...

    鄒立鵬 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<