想要查看此教程的目錄請點擊:Java IO教程目錄貼地址
Streams或Readers/Writers在使用過程中需要是可關閉的。這需要調用close()方法。這需要一點兒思考,看下面的代碼:
InputStream input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();
while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = input.read();
}
input.close();
這段代碼看起來很好。但是如果doSomethingWithData()方法拋出異常會發生什么?對的!如果發生異常InputStream就不會被關閉了!
下面的代碼避免了這樣的問題:
InputStream input = null;
try{
input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();
while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = input.read();
}
}catch(IOException e){
//do something with e... log, perhaps rethrow etc.
} finally {
if(input != null) input.close();
}
注意一下現在InputStream是怎么樣在finally下關閉的。不管在try代碼塊中發生了什么,finally中的代碼都會被執行。所以InputStream總是會被關閉。
但是close()方法如果拋出異常會發生什么?是說stream已經被關閉了?好吧,你可能要用try-catch去catch住這個異常,像下面這樣:
} finally {
try{
if(input != null) input.close();
} catch(IOException e){
//do something, or ignore.
}
}
這樣嵌套的去處理問題,看起來非常丑陋,盡管解決了問題。這樣不優雅的異常處理代碼并不夠好,他可以在你的代碼中重復的傳播。如果寫代碼時候比較匆忙,忘記異常處理該怎么辦?
想象一下如果從doSomethingWithData()拋出一個異常,第一個catch捕捉到那個異常,InputStream在finally關閉。但是,如果從input.close()方法拋出一個異常會發生什么?兩個異常中的哪一個應該被傳播到調用堆棧?
幸運的是,有一個方法解決這個問題。解決的辦法是 Exception Handling Templates in Java。創建一個異常處理模板在最后來關閉流。代碼一次寫完,可以在各處重用。可以在Exception Handling Templates in Java學習更多。
Java 7中Java IO 的異常處理
Java7開始有一個新的異常處理機制叫做“try with resources”,它是一個語法糖。這個異常處理機制特別的地方在于你使用資源時需要在使用后關閉,那么用它可以解決這個問題,例如使用InputStream,OutputStream時等等。想要學習和它更多相關的內容可以去Try With Resources in Java 7
.
.