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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张青峰 黑马帝   /  2012-2-4 11:04  /  2368 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过学习毕老师的视频(19天的通过缓冲区复制文本),自己结合前面学习的IO流知识写了一个程序,本来想实现了这样的一个功能:在被复制的文本后面加入其它内容,但是运行结果却是在文本的前面加入了内容?这是为什么?
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);
         b.write("你好");
         bufwr = new BufferedWriter(/*new FileWriter("c:\\1234.txt")*/b);
         String line = null;
         while((line = bufr.readLine())!=null){
                bufwr.write(line);
                bufwr.newLine();
                bufwr.flush();
         }
         bufwr.close();
}
}

评分

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

查看全部评分

6 个回复

倒序浏览
你写入的内容在复制内容之前当然是这样了。复制内容和写入内容顺序调换下。
回复 使用道具 举报
楼主,从你想表达的意思理解,你是想将c:\\123.txt 的内容 复制到c:\\1234.txt里并在后面加上“你好”

    FileWriter b = new FileWriter("c:\\1234.txt",true);
         b.write("你好");
但在你的代码里,你先建立了对文件1234.txt的一个节点流,并向节点流里写入了“你好”,此时“你好”追加到了1234.txt的末尾
楼主再对这个节点流创建缓冲流并未对“你好”起到作用
         bufwr = new BufferedWriter(/*new FileWriter("c:\\1234.txt")*/b);
         String line = null;
下面是“你好”已经写到1234.txt后,楼主才开始把123.txt里的内容逐行写入到1234.txt,所以得不到楼主想要的结果
         while((line = bufr.readLine())!=null)
         {
                bufwr.write(line);
                bufwr.newLine();
                bufwr.flush();
        }

要想得到理想的结果可以这样修改

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.write("你好");
         bufwr.flush();
         bufwr.close();
楼主试试

评分

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

查看全部评分

回复 使用道具 举报
问题出在你先把想要加入的内容写到了I/O流中然后才把想要复制的文件写入I/O流这样
刷新之后肯定是“你好”在前面,代码改下就可以了
  1. public static void main(String[] args) {
  2.                   BufferedReader bufr = null;
  3.               BufferedWriter bufwr = null;
  4.               try{
  5.                       bufr = new BufferedReader( new FileReader("d:\\123.txt") );
  6.                       bufwr = new BufferedWriter(new FileWriter("d:\\1234.txt",true));
  7.                       String line = null;
  8.                       while((line = bufr.readLine())!=null){
  9.                               bufwr.write(line);
  10.                           bufwr.newLine();
  11.                          }
  12.                       bufwr.write("你好");
  13.                       bufwr.flush();
  14.               }
  15.               catch(Exception e){
  16.                       throw new RuntimeException("读写失败");
  17.               }
  18.               finally{
  19.                       if(bufr!=null)
  20.                                         try
  21.                                         {
  22.                                                 bufr.close();
  23.                                         }
  24.                                         catch (IOException e)
  25.                                         {
  26.                                                 throw new RuntimeException("读取关闭失败");
  27.                                         }
  28.                                 if(bufwr!=null)
  29.                                         try
  30.                                         {
  31.                                                 bufwr.close();
  32.                                         }
  33.                                         catch (IOException e)
  34.                                         {
  35.                                                 throw new RuntimeException("写入关闭失败");
  36.                                         }
  37.               }
  38.         }
复制代码
这样就可以了

评分

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

查看全部评分

回复 使用道具 举报
雄新你的那个好像是不对的,那样改楼主的运行效果是一样的。
如: 123.txt内容为sss,楼主想得到的 234.txt结果是: sss你好。但是事实上结果是 :你好sss
错误原因:楼主的代码会先创建一个1234.txt文件(楼主可以再while循环Debug试一下看是否有1234.txt文件) 并且写入内容,当然你打开看的时候会是空因为没有关闭b(在b.write("你好"))后面加上b.close()d的话就可以看到内容了  :你好,然后再往1234.txt里面写123.txt的内容。结果当然会是:你好123.

评分

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

查看全部评分

回复 使用道具 举报
http://bbs.itheima.com/forum.php ... tid=6604&extra=     欢迎来看这一道问题
回复 使用道具 举报
陈时峰 发表于 2012-2-4 11:58
问题出在你先把想要加入的内容写到了I/O流中然后才把想要复制的文件写入I/O流这样
刷新之后肯定是“你好” ...


我觉得你的try语句还可以在优化一下,即在每次while循环后都刷新一下,这样可以保证在复制文件时发生一些特殊情况导致的文件丢失的情况。


try{

                      bufr = new BufferedReader( new FileReader("d:\\123.txt") );

                      bufwr = new BufferedWriter(new FileWriter("d:\\1234.txt",true));

                      String line = null;

                      while((line = bufr.readLine())!=null){

                              bufwr.write(line);

                          bufwr.newLine();
                          
                          bufwr.flush();  

                         }

                      bufwr.write("你好");

                      bufwr.flush();

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