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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-9-22 10:52  /  1540 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红潮 于 2012-9-23 10:20 编辑
  1. //在D盘创建一个文件,用于存储C盘文件中的数据

  2. import java.io.*;

  3. class CopyFileTest
  4. {
  5. public static void main(String[] args)throws IOException
  6. {
  7. copy_2();
  8. }

  9. public static void copy_2()
  10. {
  11. FileWriter fw = null;
  12. FileReader fr = null;

  13. try
  14. {
  15. fw = new FileWriter("FileReaderTest1.java");
  16. fr = new FileReader("OutputFactory.java");
  17. char[] ch = new char[1024];//要是文件比1024还大,为什么还能读出来?

  18. int len = 0;
  19. while ((len=fr.read(ch))!=-1)
  20. fw.write(ch,0,len);
  21. }
  22. catch (IOException e)
  23. {
  24. throw new RuntimeException("读写失败!");
  25. }

  26. finally
  27. {
  28. if (fr!=null)
  29. try
  30. {
  31. fr.close();
  32. }
  33. catch (IOException e)
  34. {
  35. throw new RuntimeException("文件读取失败!");
  36. }
  37. if (fw!=null)
  38. try
  39. {
  40. fw.close();
  41. }
  42. catch (IOException e)
  43. {
  44. throw new RuntimeException("文件写入失败!");
  45. }
  46. }
  47. }
  48. }
  49. //字符数组定义的大小是1024,可当循环1024完成后,它还会继续往下读取,数组是怎么继续往下自动读取文本数据的?
复制代码

5 个回复

正序浏览
我注意到楼主最上面的一句 要把C盘文件复制到D盘 那你下面这两句必须得改成绝对路径了

fw = new FileWriter("FileReaderTest1.java");  //这个只是在当前文件目录下拷贝文件 不能实现楼主的功能
fr = new FileReader("OutputFactory.java");

然后下面这段:因为数组虽然只有1024长度,但是可以循环覆盖,写满了继续写就会用新的文件内容覆盖掉旧的内容了。
char[] ch = new char[1024];// 要是文件比1024还大,为什么还能读出来?
int len = 0;
while ((len = fr.read(ch)) != -1)
fw.write(ch, 0, len);     
文件读取,只要是读到末尾就会返回一个-1,后面是api的原话 (读取的字符数,如果已到达流的末尾,则返回 -1 )
所以,只要没有读到末尾,数组数据就会循环被覆盖,然后再写到目标文件中。
所以,即使你定义一个只有1个长度的数组,依然可以复制完整个文件。

希望上面的回复对楼主有帮助

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
说明两点,你就明白了。
第一、输入流将读入的数据,放在数组里面;输出流将数组里面的数据,写到硬盘;
第二、因为
while ((len=fr.read(ch))!=-1){
fw.write(ch,0,len);
}
有这个循环。所以,可以连续不断的读,直到读完数据为止
回复 使用道具 举报
while ((len=fr.read(ch))!=-1)
这个语句会循环读取文件中的数据,读取一次后写入另一个文件,写完后再读取一次,就这样循环读取,后面读取的数据会覆盖前面读取的数据,一直到读取的字符为空时会返回-1结束循环
回复 使用道具 举报
while ((len=fr.read(ch))!=-1)

fw.write(ch,0,len);
不错,ch的长度确实是1024个字符,但是你有没有看到这是一个while循环,只要循环条件满足,就会继续往下循环,而且这儿的ch只是中间量,后面的会覆盖前面,举个例子:
就像 int i = 9;
但是 我们可以通过一系列的操作来改变 i 的值 比如有一个方法 对其进行+n操作,最后i的值是会改变的哦
回复 使用道具 举报
while ((len=fr.read(ch))!=-1)

fw.write(ch,0,len);

}
你写的不是循环读取吗

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