三种IO流对象关闭的方式

背景: JDK-7

一、在finally最后关闭(普通)

在try-catch-finally最后按照声明对象的逆顺序关闭流对象:

finally {
       if (in != null) {
          try {
              in.close();
          } catch (IOException e) {
              //错误处理
          }
       }
       if (out != null) {
          try {
              out.close();
          } catch (IOException e) {
             //错误处理
          }
       }
 } 

注意事项:

    1.    在关闭流对象的时候需要加上try-catch语句,防止close语句报错。

    2.    对于多个流对象,需要使用相同个数的try-catch依次关闭。倘若所有流都在同一个try语句中关闭,那么当第一个流对象关闭报错时,系统会跳过往下的关闭语句,而执行catch语句。

finally {
    try {
           if (in != null) {
                  in.close();  //当in.close()发生错误时,out.close()将被跳过,因此此处需要再加上try-catch语句
           }
           if (out != null) {
                  out.close();
           }
        }catch (IOException e) {
             //错误处理
        }
 } 

二、 在finally中使用IOUtils.closeQuietly()方法关闭

1.    IOUtils类提供了closeQuietly方法去关闭相应的流对象,其内部实现就是第一种方法

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

2.    该方法虽然可以替换第一种方法,少写许多代码,但是捕获到的异常都会被忽略。因此该方法需要慎重使用。

三、    try-with-resource 语法糖

例子:

try (
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       ...  //其他流对象
       ...
   ) { // try此处是()括号而非花括号
       // Do something
   } finally {
        
   }

1.    try()中可以声明多个流对象,无论运行是否出错,最终都会按照声明的逆顺序依次关闭。

2.    try()中只能声明实现了AutoCloseable接口的流对象,否则报错。

3.    该方法的缺点是,倘若有两个流对象A,B,对象B是通过File获取的流对象,此时File对象因为没有实现AutoCloseable接口从而无法放入try()。所以,使用 try-with-resource 语法糖 除了要满足第二条的条件外,对于流对象间互相依赖也有限制。

 

总结:

一般情况,try-with-resource 语法糖能够节省许多代码,而对于IOUtils.closeQuietly()方法和普通try-catch的选用,需要依照实际情况选择,例如有多个流对象需要关闭,那么选用IOUtils.closeQuietly(),倘若要对流对象关闭时的异常进行相关的处理,那么还是使用普通的方式较好。

Java  零基础新手入门网站 

你可能感兴趣的:(自学Java一百天)