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以上版本才支持该功能

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,417评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,962评论 25 709
  • MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支...
    但莫阅读 3,486评论 0 6

友情链接更多精彩内容