其中的out,就是指向你创建BufferedWriter对象时往构造函数里传的那个FileWriter。因此,BufferedWriter的close()方法确实关闭了底层的FileWriter流,无需再来一次close()。可是如果大家到网上一搜,就会发现还是有不少文章说BufferedWriter和它所包装的FileWriter的close()方法都要调用一次,而且必须先调BufferedWriter的close,再调FileWriter的close,否则会报异常,说流已关闭。我读到这里觉得疑惑,JDK API文档在BufferedWriter 和FileWriter 的close()方法中明明都写了一句:Closing a previously closed stream has no effect(关闭一个之前已被关闭的流,不会产生任何效果)啊,怎么先关BufferedWriter再关FileWriter就报异常了呢?
那么为何JDK API文档又说“Closing a previously closed stream has no effect”呢?呵呵,其实人家是说:如果你多次调用fw.close()【或】多次调用bw.close()不会出问题,而不是说你混合着调用两者不会出问题。对bw.close()来说,当你调用了一次后,它底层的Writer流就被设为null(out=null),下次再调用时被if(out==null)拦下,直接return,确实"has no effect"。另一方面,fw.close()的源码实际上是调用了一个叫StreamEncoding类的close()方法。这个类挺神秘,下载的JDK源码包里没它,得去http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html 查看。它的close()方法代码如下: