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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柳超 中级黑马   /  2014-7-21 09:41  /  1297 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <p>//用字符流复制一个文件
  2. import java.io.*;
  3. class  FileReaderTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 FileReader fr= null;
  8.                 FileWriter fw=null;
  9.                 try
  10.                 {
  11.                         fr=new FileReader("fortask.java"); //创建字符读取流
  12.                         fw=new FileWriter("fortasek_copy.java");//创建字符输入流
  13.                         char[] cha=new char[1024];  //定义字符数组,完成输入输出流
  14.                         int length;                                 //第三方变量保存字符数组使用的长度
  15.                         while((length=fr.read(cha))!=-1)
  16.                         {
  17.                                 fw.write(cha,0,(fr.read(cha)));//这里fr.read(cha)如果不使用length就会出错
  18.                                                                                         //想请教 使用length 和 fr.read(cha)有什么区别 都是Int型大小也相同
  19.                         }
  20.                        
  21.                 }
  22.                 catch (IOException e)
  23.                 {

  24.                 }
  25.                 finally
  26.                 {
  27.                 try//关闭字符读取
  28.                 {
  29.                         if(fr!=null)
  30.                                 fr.close();  
  31.                 }
  32.                 catch (IOException e)
  33.                 {
  34.                
  35.                 }
  36.                 try//关闭字符输入
  37.                 {
  38.                         if(fw!=null)
  39.                                 fw.close();
  40.                 }
  41.                 catch (IOException e)
  42.                 {

  43.                 }
  44.                 }
  45.                                
  46.         }
  47. }</p><p> </p><p> </p><p> </p><p>while((length=fr.read(cha))!=-1)
  48.                         {
  49.                                 fw.write(cha,0,(fr.read(cha)));//这里fr.read(cha)如果不使用length而是如此写就会出错
  50. //想请教 使用length 和 fr.read(cha)有什么区别      都是Int型大小也相同   为什么文中写的运行会出错
  51. }

  52. </p>
复制代码

5 个回复

倒序浏览
没有人解答
自顶一下
回复 使用道具 举报
你每调用一次fr.read(cha)的时候都会把一组新的数据存入字符数组,当最后一次进入循环的时候,在while循环条件中调用fr.read(cha)把剩余的字符读完了,你在循环体中再次调用fr.read(cha),返回值是-1,程序当然报错了,如果使用length,就能保证每次循环只调用一次fr.read(cha).
回复 使用道具 举报
因为你调用了Read();方法 是会读入数据的,具体参考API
回复 使用道具 举报
lancerjs 发表于 2014-7-21 10:16
你每调用一次fr.read(cha)的时候都会把一组新的数据存入字符数组,当最后一次进入循环的时候,在while循环条 ...

也就是説fr.read(cha)每次出现都会执行,而在循环中写就有可能导致,判断条件没有起做用!
而下面的返加结果是-1 indexoutof  这个异常!
fr.read(cha) 説白了    就肯 是    it.next 一个性质!  
如果是这样 我觉得我明白 了
回复 使用道具 举报
简单说就是你fw.write(cha,0,(fr.read(cha)))中(fr.read(cha)不简单是长度int的问题,他也执行了读取的方法,相当于你while循环执行了i两次,就算让你编译通过,文件也复制不过来。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马