Java中為IO流寫一個快速關閉流的小工具
阿新 • • 發佈:2019-01-26
考慮這樣一種場景,你要為系統編寫一個下載檔案並快取到本地的功能,你會用到InputSteam和OutputStream類,你可能會這麼寫:
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("");
os = new FileOutputStream("");
//下載檔案
//儲存到本地
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在finally程式碼塊中,為了關閉兩個IO流寫了14行程式碼,有沒有什麼辦法可以用一行程式碼就搞定呢?檢視InputStream和OutputStream抽象類原始碼,發現他們都實現了共同的介面Closeable,事實上,java中所有流都必須實現這個介面,那麼,這下就好辦了。
我們可以設計一個工具類,如下:
public class IOUtil {
public static void close(Closeable... closeableList) {
try {
for (Closeable closeable : closeableList) {
if (closeable != null){
closeable.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
那麼,在finally程式碼塊中就可以這樣寫:
finally{
// if (is != null) {
// try {
// is.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if (os != null) {
// try {
// os.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
IOUtil.close(is, os);
}
是不是方便了很多呢?這個工具類用到了可變引數,介面隔離的思想。這樣寫程式碼,不僅僅只是方便而已,程式碼的可讀性也好了很多,不是嗎?