黑马程序员技术交流社区
标题:
引发的一个问题--javaIO
[打印本页]
作者:
衣服
时间:
2012-2-4 17:26
标题:
引发的一个问题--javaIO
import java.io.*;
public class CopyTextByBuff {
public static void main(String[] args ) throws IOException{
BufferedReader bufr = null;
BufferedWriter bufwr = null;
FileReader a = new FileReader("c:\\123.txt");
bufr = new BufferedReader( a );
FileWriter b = new FileWriter("c:\\1234.txt",true);
bufwr = new BufferedWriter(/*new FileWriter("c:\\1234.txt")*/b);
String line = null;
while((line = bufr.readLine())!=null){
bufwr.write(line);
bufwr.newLine();
}
bufwr.flush();
b.write("你好");
bufwr.close();
}}
问题:如果程序这样写的话为什么必须得先 flush 然后才能用b.write()来写“你好才会位于文本内容的最后”??? 如果将b.write()与flush换一下位置的话,为什么“你好”将会位于文本内容的最开端????
请不要回答如何写才会正确,我知道应该如何写,我想问下上面说的问题是为什么??????
http://bbs.itheima.com/thread-6589-1-1.html
先一个问题地址
作者:
王文龙
时间:
2012-2-4 18:34
我认为:
若不用缓冲区技术,就会输入一个字符便写入文本中一个字符;
而缓冲区为提高效率,会缓冲数据再一并写入文本,只有刷新了缓冲区,才能把数据写入文本,
若不刷新缓冲区,数据只会停留在缓冲区内,根本不能写入文本.
故本题中,b.write("")一执行就会向文本中输入数据,
而bufwr用缓冲技术必须刷新后才把数据取出缓冲区写入文本.
作者:
张伟~
时间:
2012-2-4 18:45
前面我就不说了,先后顺序一目了然。
将b.write()与flush换一下位置的话,按我理解就是你没刷新的话,数据都还放在缓冲区里,然后你先b.write("你好"),而b所直接操作的是
new FileWriter("c:\\1234.txt",true);也就是说后面刷新的时候"你好"先一步被刷进文件里了,"你好"就跑到前头了
作者:
黄秋
时间:
2012-2-4 19:01
当你明白flush 的用途时,就基本明白这问题了。
缓冲区写:缓冲区满时,才会将缓冲区里的数据写入到文件中去(这样做是为了提高性能)。只要缓冲区不满或是没调用flush、close方法,是不会将数据写入文件的。既然close 也会强制写入,
bufwr.flush();
b.write("你好");
bufwr.close();
改成:bufwr.close();
b.write("你好");
也行。
作者:
最初的理想
时间:
2012-2-5 17:01
一个使用了缓冲区,一个没有缓冲区,
bufwr.flush();
b.write("你好"); //相当于你先往1234中写入了东西,再写 你好,
b.write("你好"); //相当于先写了你好 再写其他东西,当然就有先后顺序了。
bufwr.flush();
作者:
成果
时间:
2012-2-5 22:49
因你调用flush()之前数据存储在缓存中间。调用flush()之后才将缓存中的数据写入硬盘。
作者:
成果
时间:
2012-2-5 23:02
public BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
java 中有部份IO操作是读写缓存的。你用的这个BufferedWriter。BufferedReader就是。
而FileInputStream.FileOutputStream是操作磁盘的。
具体可以查阅jdk帮助文档。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2