黑马程序员技术交流社区

标题: 引发的一个问题--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