java IO 关闭顺序分析

相信基于java io 编过程的朋友们,或多或少,都会遇到java.io.IOException: Stream closed这种异常。归根到底,是我们在关闭各种IO流的时候,没有注意到顺序。
下面,结合我对IO的理解,分析一下,究竟怎么样正确关闭。
读过jdk io 源码的朋友们应该知道,它使用了一种叫装饰器模式来组织类的。举个实例代码来说:
    FileOutputStream fos = new FileOutputStream("f:\\william");
    OutputStreamWriter osw = newOutputStreamWriter(fos);
    BufferedWriter bw = newBufferedWriter(osw);
    bw.write("hello world!");


下面,我把jdk中,BufferedWriter流关闭时的代码,展示给大家:

  public void close() throws IOException {
    synchronized (lock) {
        if (out == null) {
       return;
        }
        try {
            flushBuffer(); //注意
        } finally {
            out.close();
            out = null;
            cb = null;
        }
    }
    }
}


发现,原来在close一个流的时候,它会执行一次flush操作,因此,当把BufferedWriter.close()时,它会把自身的内容,一次性flush出去。如果此时OutputStreamWriter已经关闭了,那么BufferedWriter自身的内容流不出去,因此会抛出java.io.IOException: Stream closed。同理,OutputStreamWriter与FileOutputStream也一样道理。
正确关闭流的顺序是:
    bw.close();
    osw.close();
    fos.close();
分析到此结束。

转载自: http://blog.sina.com.cn/s/blog_69a4df530100p8wd.html

参考:http://blog.csdn.net/shijinupc/article/details/7191655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值