Java之流的关闭

我们深知在操作Java流对象后要将流关闭,但往往事情不尽人意,大致有以下几点需要注意的地方。

在finally中关流

  • 错误示例
try {  
    OutputStream out = new FileOutputStream("");  
    // ...操作流代码  
    out.close();  
} catch (Exception e) {  
    e.printStackTrace();  
}  
  • 正确方案
OutputStream out = null;  
try {  
    out = new FileOutputStream("");  
    // ...操作流代码  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    IOUtils.closeQuietly(out);
}  

//IOUtils.java  
public static void closeQuietly(Closeable closeable) {     
    try {         
        if (closeable != null) {             
            closeable.close();         
        }     
    } catch (IOException ioe) {         
        LogUtils.e(ioe);     
    } 
}

在关闭多个流时不要在一个try中

  • 错误示例
OutputStream out = null;  
OutputStream out2 = null;  
try {  
    out = new FileOutputStream("");  
    out2 = new FileOutputStream("");  
    // ...操作流代码  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    try {  
        if (out != null) {  
            out.close();// 如果此处出现异常,则out2流没有被关闭  
        }  
        if (out2 != null) {  
            out2.close();  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  
  • 正确方案
OutputStream out = null;  
OutputStream out2 = null;  
try {  
    out = new FileOutputStream("");  
    out2 = new FileOutputStream("");  
    // ...操作流代码  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    IOUtils.closeQuietly(out2);
    IOUtils.closeQuietly(out); 
}  

此外,在关闭多个流时,需要注意关闭顺序,通常有以下几个原则:

1.先打开的后关闭,后打开的先关闭
2.看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b

在循环中创建流,在循环内关闭每个流

  • 错误示例
OutputStream out = null;  
try {  
    for (int i = 0; i < 10; i++) {  
        out = new FileOutputStream("");  
        // ...操作流代码  
    }  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    IOUtils.closeQuietly(out);
}  
  • 正确方案
for (int i = 0; i < 10; i++) {  
    OutputStream out = null;  
    try {  
        out = new FileOutputStream("");  
        // ...操作流代码  
    } catch (Exception e) {  
        e.printStackTrace();  
    } finally {  
        IOUtils.closeQuietly(out);
    }  
}  

Java 7提供try-catch-resources接口处理流的关闭

只要实现的自动关闭接口(Closeable)的类都可以在try结构体上定义,java会自动帮我们关闭,及时在发生异常的情况下也会。可以在try结构体上定义多个,用分号隔开即可。

try (OutputStream out = new FileOutputStream("");
                    OutputStream out2 = new FileOutputStream("")){  
    // ...操作流代码  
} catch (Exception e) {  
    throw e;  
} 

注意:在Android中,API19以上版本才支持该功能

你可能感兴趣的:(Java之流的关闭)