1. 程式人生 > >Java中為IO流寫一個快速關閉流的小工具

Java中為IO流寫一個快速關閉流的小工具

考慮這樣一種場景,你要為系統編寫一個下載檔案並快取到本地的功能,你會用到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);
}

是不是方便了很多呢?這個工具類用到了可變引數,介面隔離的思想。這樣寫程式碼,不僅僅只是方便而已,程式碼的可讀性也好了很多,不是嗎?