java9版本特性資源自動(dòng)關(guān)閉的語(yǔ)法增強(qiáng)

我計(jì)劃在后續(xù)的一段時(shí)間內(nèi),寫(xiě)一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫(xiě)成一系列的文章,大概十篇左右。
在Java 9的版本中,對(duì)從JDK 7開(kāi)始支持的try-with-resources語(yǔ)法進(jìn)行了改進(jìn)。雖然只是一個(gè)小小的改進(jìn),我仍希望把他介紹給你,我們一起來(lái)每天進(jìn)步一點(diǎn)點(diǎn)。
一、先說(shuō)Java7的try-with-resources(Java9改進(jìn)版在后文)
在Java 7之前沒(méi)有try-with-resources語(yǔ)法,所有的流的銷(xiāo)毀動(dòng)作,全都需要自己在finally方法中手動(dòng)的寫(xiě)代碼進(jìn)行關(guān)閉。如下文中的代碼,將一個(gè)字符串寫(xiě)入到一個(gè)文件里面。
@Test
void testStream() throws IOException {
String fileName = "D:\\data\\test\\testStream.txt";
FileOutputStream fos = new FileOutputStream(fileName); //創(chuàng)建IO管道流
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
try{
bw.write("手寫(xiě)代碼進(jìn)行Stream流的關(guān)閉");
bw.flush();
}finally{
bw.close(); //手動(dòng)關(guān)閉IO管道流
osw.close();
fos.close();
}
}從Java 7版本開(kāi)始提供了try-with-resources語(yǔ)法,我們只需要把管道流用try()包含起來(lái),在try代碼段執(zhí)行完成之后,IO管道流就會(huì)自動(dòng)的關(guān)閉,不需要我們手寫(xiě)代碼去關(guān)閉,這很簡(jiǎn)潔!
@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管道流被自動(dòng)調(diào)用close()方法");
bw.flush();
}
}二、避免走入誤區(qū)
很多小伙伴在知道try-with-resources語(yǔ)法之后,容易陷入誤區(qū)
誤區(qū)一:只有IO管道流才能使用try-with-resources語(yǔ)法,進(jìn)行自動(dòng)的資源關(guān)閉
誤區(qū)二:所有帶有close()方法的類(lèi)對(duì)象,都會(huì)自動(dòng)的調(diào)用close()方法進(jìn)行資源關(guān)閉
誤區(qū)一把實(shí)踐范圍縮小了,而誤區(qū)二把實(shí)踐范圍夸大了。那么什么樣的資源可以被自動(dòng)關(guān)閉呢?答案就是實(shí)現(xiàn)了AutoCloseable或Closeable接口的類(lèi)可以自動(dòng)的進(jìn)行資源關(guān)閉。
public interface Closeable extends AutoCloseable {
public void close() throws IOException;
}Closeable接口繼承自AutoCloseable接口,二者都包含close()方法。如果你自定義的占用系統(tǒng)資源的類(lèi)需要進(jìn)行資源回收,請(qǐng)實(shí)現(xiàn)這兩個(gè)接口之一,并在close()方法中進(jìn)行資源回收與關(guān)閉。這樣你自定義的類(lèi),也可以使用try-with-resources語(yǔ)法進(jìn)行資源回收與關(guān)閉。
三、try-with-resources在Java 9中的改進(jìn)
try-with-resources語(yǔ)法在java 9 中進(jìn)行了改進(jìn),try-with-resources語(yǔ)法的try()可以包含變量,多個(gè)變量用分號(hào)隔開(kāi)。 這樣的改進(jìn)目的是讓語(yǔ)義更加明確,將資源創(chuàng)建代碼與嘗試資源回收的語(yǔ)法分離。
語(yǔ)義一:嘗試去執(zhí)行代碼段,如果拋出異常,對(duì)異常進(jìn)行處理
語(yǔ)義二:嘗試去自動(dòng)關(guān)閉資源,關(guān)閉誰(shuí)?關(guān)閉被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){ //注意這里:嘗試去回收這三個(gè)對(duì)象對(duì)應(yīng)的資源,和上文中的java 7代碼對(duì)比
bw.write("Java9-可以被自動(dòng)調(diào)用close()方法");
bw.flush();
}
}以上就是java9版本特性資源自動(dòng)關(guān)閉的語(yǔ)法增強(qiáng)的詳細(xì)內(nèi)容,更多關(guān)于java9資源自動(dòng)關(guān)閉的語(yǔ)法增強(qiáng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用flyway實(shí)現(xiàn)腳本自動(dòng)化的方法詳解
Flyway是一個(gè)開(kāi)源的數(shù)據(jù)庫(kù)版本控制工具,主要用于管理數(shù)據(jù)庫(kù)的版本和變更,它可以自動(dòng)化地將數(shù)據(jù)庫(kù)遷移到不同的版本,同時(shí)支持多種數(shù)據(jù)庫(kù)類(lèi)型,本文給大家介紹了如何使用flyway實(shí)現(xiàn)腳本自動(dòng)化,需要的朋友可以參考下2023-10-10
基于spring cloud多個(gè)消費(fèi)端重復(fù)定義feign client的問(wèn)題
這篇文章主要介紹了spring cloud多個(gè)消費(fèi)端重復(fù)定義feign client的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案
本篇文章主要介紹了淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作
這篇文章主要介紹了Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring?Boot中的max-http-header-size配置方式
這篇文章主要介紹了Spring?Boot中的max-http-header-size配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

