美文网首页
Java之流的关闭

Java之流的关闭

作者: 米莉_L | 来源:发表于2016-11-10 17:47 被阅读0次

我们深知在操作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之流的关闭

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

  • 后端操作汇总

    一、管理Java程序 启动java进程(关闭terminal程序会退出): 启动后台java进程(关闭termin...

  • 2016年12月24号网络文摘阅读笔记

    CSDN主页:破光之流风 Oracle 勒紧 Java 脖子上的绞索,Java SE 用户面临巨大恐慌 原文地址:...

  • Java8之流

    在这篇文章中您主要可以看到以下内容: 流简介流操作收集器并行流 前言 关于Java8的其他信息和代码的完整部分可以...

  • Java线程池的关闭

    一 java线程池关闭方法 1.1 shutdown void shutdown() 此方法关闭线程池不是直接关闭...

  • java9新特性-9-语法改进:try语句

    1. 使用举例 在java8 之前,我们习惯于这样处理资源的关闭: java 8 中,可以实现资源的自动关闭,但是...

  • Linux中 java -jar 命令后台运行

    java -jar x.jar 这样执行jar包时,命令窗口必须一直开着,关闭窗口程序也关闭了。 java -ja...

  • Effective Java(3rd)-Item9:try-wi

      Java库包括了许多必须通过调用关闭方法被手动关闭的资源。比如 InputStream, OutputStre...

  • linux 查看进程被关闭记录

    sudo dmesg -T | grep "(java)" 就能查看关闭记录

  • Java基础之流程语句

    一、顺序结构 代码在执行过程中如果没有控制语句,代码就会一句一句的执行下去,直到结束。 二、选择结...

网友评论

      本文标题:Java之流的关闭

      本文链接:https://www.haomeiwen.com/subject/suqvyttx.html