黑马程序员技术交流社区
标题:
流关闭问题
[打印本页]
作者:
张志阳
时间:
2012-4-3 12:36
标题:
流关闭问题
BufferedWriter中,操作结束关闭缓冲区就是在关闭缓冲区中的流对象;如果直接关闭流对象会怎样啊?有木有区别啊?
作者:
罗闯
时间:
2012-4-3 15:27
用这个给你举例:
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。
希望对你有帮助
作者:
陈苓
时间:
2012-4-3 15:39
直接关闭流,close();关闭流,但会先刷新
因为流对象最终使用的是本地系统中的资源完成的动作。
所以使用完了系统资源后,一定会释放。所以close的动作一定要有。
BufferedWriter先刷新缓冲区中的数据到目的地,然后关闭缓冲区中的流资源。
两者不同的是一个有缓冲区,一个没有缓冲区,最后的动作都是一样的把流关闭了。
如果你使用了缓冲区,直接关闭缓冲区就可以了,就不用再关闭了。
//创建字符输出流对象,并创建存储数据的目的地。
// FileWriter fw = new FileWriter("c:"+ToolSeparator.FILE_SEPARATOR+"buf.txt");
FileWriter fw = new FileWriter("buf.txt");
//为了提高写入效率,定义了字符输出流缓冲区,并和指定的字符输出流对象关联。
BufferedWriter bufw = new BufferedWriter(fw);
// 使用fw的方法可以。既然有了缓冲区对fw进行效率的提高。
// 可以使用缓冲区的高效方法,来操作数据。其实底层使用还是fw的方法。只不过对其高效了。
//bufw.write("hahahas");//数据被写入到了缓冲区中。相当于水已经到了杯子中.
//bufw.write(ToolSeparator.LINE_SEPARATOR+"hehiehie");
//bufw.newLine();//获取系统自带的换行符进行换行。
//bufw.write("xxixiixi");
//bufw.flush();//刷新缓冲区。记住:只要用到缓冲区,记得一定要刷新。
for(int x=0;x<4;x++){
bufw.write(x+"hahahaha");
bufw.newLine();
bufw.flush();
}
bufw.close();//先刷新缓冲区中的数据到目的地,然后关闭缓冲区中的流资源。
//fw.close(); //所以fw就不用关闭了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2