A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 衣服 黑马帝   /  2012-2-4 17:26  /  2110 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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        先一个问题地址

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

6 个回复

倒序浏览
我认为:
若不用缓冲区技术,就会输入一个字符便写入文本中一个字符;
而缓冲区为提高效率,会缓冲数据再一并写入文本,只有刷新了缓冲区,才能把数据写入文本,
若不刷新缓冲区,数据只会停留在缓冲区内,根本不能写入文本.

故本题中,b.write("")一执行就会向文本中输入数据,
而bufwr用缓冲技术必须刷新后才把数据取出缓冲区写入文本.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
前面我就不说了,先后顺序一目了然。
将b.write()与flush换一下位置的话,按我理解就是你没刷新的话,数据都还放在缓冲区里,然后你先b.write("你好"),而b所直接操作的是
new FileWriter("c:\\1234.txt",true);也就是说后面刷新的时候"你好"先一步被刷进文件里了,"你好"就跑到前头了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
当你明白flush 的用途时,就基本明白这问题了。
  缓冲区写:缓冲区满时,才会将缓冲区里的数据写入到文件中去(这样做是为了提高性能)。只要缓冲区不满或是没调用flush、close方法,是不会将数据写入文件的。既然close 也会强制写入,
         bufwr.flush();
         b.write("你好");
         bufwr.close();

改成:bufwr.close();
        b.write("你好");
也行。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
一个使用了缓冲区,一个没有缓冲区,  
bufwr.flush();
  b.write("你好"); //相当于你先往1234中写入了东西,再写 你好,
  b.write("你好");  //相当于先写了你好 再写其他东西,当然就有先后顺序了。
     bufwr.flush();
                                                               
回复 使用道具 举报
因你调用flush()之前数据存储在缓存中间。调用flush()之后才将缓存中的数据写入硬盘。
回复 使用道具 举报
成果 黑马帝 2012-2-5 23:02:49
7#
public BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
java 中有部份IO操作是读写缓存的。你用的这个BufferedWriter。BufferedReader就是。
而FileInputStream.FileOutputStream是操作磁盘的。
具体可以查阅jdk帮助文档。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马