
我計劃在后續的一段時間內,寫一系列關于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關注,期待您能關注我,我將把java 9 寫成一系列的文章,大概十篇左右,
- java9第一篇-可以在interface中定義私有方法了
在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();
}
}
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173102.html
標籤:Java
上一篇:CDH5部署三部曲之三:問題總結
