黑马程序员技术交流社区
标题:
一个IOl流问题
[打印本页]
作者:
李杰
时间:
2012-8-23 16:10
标题:
一个IOl流问题
用缓冲流的时候用完直接关掉缓冲流就可以了,能不能不关缓冲流,只关掉字符流?像下面代码一样
FileWriter fw=null;
try
{
fw=new FileWriter("xx.txt");
BufferedWriter bw=new BufferedWriter(fw);
for (int i = 0; i < 5; i++)
{
bw.write("abcde");
bw.newLine();
bw.flush();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
复制代码
作者:
刘源
时间:
2012-8-23 16:43
必须可以啊。因为缓冲区底层关闭的也是字符流的资源。
缓冲区只是比字符流多了些功能,并没有多调用底层资源。而close()只是关闭底层资源而已。
作者:
周兴华
时间:
2012-8-23 16:55
可以的,缓冲流是装饰字符流或字节流的,缓冲流的close方法实际上就是在关闭他装饰的流。
作者:
杜鹏云
时间:
2012-8-23 18:11
通过查阅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
,具体你可以参考下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2