java优雅关闭io流

教科书关闭的方法是每个都需要判断是否为空,每个都调用close。而且每个都需要在自己的try catch里面调用

如下图

   InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader read=null;
        try {
         is = new FileInputStream(new File(""));
         isr = new InputStreamReader(is);
         read = new BufferedReader(isr);

            String s = read.readLine();

        } finally {
             try {
                  if(null!=is){
                      is.close();
                  }
             }catch (Exception e){
                 e.printStackTrace();
             }
            try {
                if(null!=isr){
                    isr.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }

            try {
                if(null!=read){
                    read.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

但是io对象都来自接口Closeable,可以通过这个来关闭。

通过apache的ioutil包提供了良好的方法

如下图

  InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader read=null;
        try {
         is = new FileInputStream(new File(""));
         isr = new InputStreamReader(is);
         read = new BufferedReader(isr);

            String s = read.readLine();

        } finally {
            IOUtils.closeQuietly(read,isr,is);
        }

查看源代码

public static void closeQuietly(Closeable... closeables) {
    if (closeables != null) {
        Closeable[] arr$ = closeables;
        int len$ = closeables.length;

        for(int i$ = 0; i$ < len$; ++i$) {
            Closeable closeable = arr$[i$];
            closeQuietly(closeable);
        }

    }
}
public static void closeQuietly(Closeable closeable) {
    try {
        if (closeable != null) {
            closeable.close();
        }
    } catch (IOException var2) {
        ;
    }

}

就是遍历关闭

原文地址:https://www.cnblogs.com/fangyuandoit/p/13713839.html