通过查阅BufferedWriter源代码可以知道,其实bw.close()和fw.close()还是有一些差别的。
public BufferedWriter(Writer out, int sz) {
super(out);
if (sz <= 0)
throw new IllegalArgumentException("Buffer size <= 0");
this.out = out;//this.out是BufferedWriter的一个内部类, BufferedWriter(Writer out, int sz) 函数初始化,将Writer子类对 象引用传递给this.out内部类引用,即你的代码里fw
cb = new char[sz];
nChars = sz;
nextChar = 0;
lineSeparator = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("line.separator"));
}
这个函数是缓冲流的close()方法。
public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try {
flushBuffer();
} finally {
out.close();//调用初始化时传递进来的writer子类的close()方法,即你的代码你的fw.close();
out = null;
cb = null;//回收缓冲区的空间
}
}
}
FileWriter源码里面的close()方法是继承OutputStreamWriter的close()方法。
OutputStreamWriter的close()方法又调用sun.nio.cs.StreamEncoder中的close()方法.
StreamEncoder位于sun.nio.cs包下面,其源码在我们jdk中是没有的。源码地址:http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html,具体你可以参考下。
|