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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-15 07:33  /  1414 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
public class TestCopy{
        public static void main(String[] args){
                try{
                        FileReader fr=new FileReader("E:/Hello.txt");
            FileWriter fw=new FileWriter("E:/ying.txt");
            while(fr.read()!=-1)
                                {
                   fw.write(fr.read());
                }
                                fr.close();
                                fw.close();
                        }
                catch(FileNotFoundException ne){
                                        System.out.println("找不到指定的文件");
                                        System.exit(-1);
                        }
                catch(IOException ie){
                                                System.out.println("文件读取错误");
                                                System.exit(-1);
                        }
                                                System.out.println("文件已经复制");
                }
}
//我事先在E盘建立了一个Hello.txt文档,但是运行程序之后,E盘中生成的文件ying.txt里的内容和Hello.txt中的内容不同
     
   

4 个回复

倒序浏览
import java.io.*;
public class TestCopy{
         public static void main(String[] args){
                try{
                        FileReader fr=new FileReader("E:/Hello.txt");
            FileWriter fw=new FileWriter("E:/ying.txt");
/*
while(fr.read()!=-1)//你'这个while语句是有问题的,假如文件中的内容是"12345";在while(fr.read()!=-1)中读取到"1"时,为true,执行fw.write(fr.read());但是在fw.write(fr.read())中是把"2"写入了,因为在 f w.write(fr.read())中fr.read()又往下读取了一个字符,也就是说读取两个字符,只写入了一个字符.
{
                   fw.write(fr.read());
                }
*/
我改了下,试了是有用的,你试试:
        int len = 0;
       char[] buf = new char[1024];
       while((len=fr.read(buf))!=-1){
       fw.write(buf,0,len);
        }
只要把原来while语句部分替换就可以了
fr.close();
                                fw.close();
                        }
                catch(FileNotFoundException ne){
                                        System.out.println("找不到指定的文件");
                                        System.exit(-1);
                        }
                catch(IOException ie){
                                                System.out.println("文件读取错误");
                                                System.exit(-1);
                        }
                                                System.out.println("文件已经复制");
                }
}
//我事先在E盘建立了一个Hello.txt文档,但是运行程序之后,E盘中生成的文件ying.txt里的内容和Hello.txt中的内容不同

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 佟亚鹏 于 2012-9-15 09:09 编辑

这个很容易想,你的ying.txt比hello.txt内容少一半对吧
看看你的这段代码
  1.     while (fr.read() != -1)
复制代码
每read一次就会读取下数据,并且下标往后移动一下,你while语句里面的read的数据和write方法内的read的数据是不一样的,每次写数据时就跳过去了while语句括号内读到的数据,应该为
  1.   while((data = fr.read()) !=-1) {
  2.    fw.write(data);
  3.    }
复制代码
这样就可以了



回复 使用道具 举报
楼主:主是你的while语句有问题,fr.read()是一个方法,
当执行到while
(fr.read()!=-1)时,可能读到的元素为a,但是
当执行到下面的fw.write(fr.read())时,就又执行了一次read方法
这时读取的元素就是下一个元素了,所以拷贝的文本有缺失
还有就是楼主的异常处理也有些问题,关闭动作是一定要执行的,
应该把关闭动作放在finally里面

下面是修改后的代码

import java.io.*;
public class TestCopy
{
        public static void main(String[] args)
  {
                try
    {
                    FileReader fr=new FileReader("E:/Hello.txt");
     FileWriter fw=new FileWriter("E:/ying.txt");
     
     int ch=0;
     while((ch=fr.read())!=-1)
                    {
       fw.write((char)ch);
        }
                 }
                 catch(FileNotFoundException ne)
     {
     System.out.println("找不到指定的文件");
     System.exit(-1);
                 }
                catch(IOException ie)
    {
     System.out.println("文件读取错误");
     System.exit(-1);
                }
    finally
    {
    try
     {
      if(fr!=null)
       fr.close();
     }
     catch (IOException e)
     {
     }
     try
     {
      if(fw!=null)
       fw.close();
     }
     catch (IOException e)
     {
     }
    }
                    System.out.println("文件已经复制");
                }
}
回复 使用道具 举报
while(fr.read()!=-1)
                                {
                   fw.write(fr.read());
                }
你读了两次,输入流有个指针,第一次读,指针指向第一个字符,紧接着又读第二次,指针就指向第二个字符了,所以写出的字符只是第二个,所以内容会减半!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马