黑马程序员技术交流社区

标题: IO流的小疑问 [打印本页]

作者: 15001162522    时间: 2015-10-6 23:21
标题: IO流的小疑问
  1. class Demo{
  2.         public static void main(String[] args){
  3.                 FileReader fr = null;
  4.                 FileWriter fw = null;
  5.                 try
  6.                 {
  7.                         fr =new FileReader("c:\\abc.txt");
  8.                         fw =new FileWriter("e:\\hehe.txt");
  9.                         char[] buf = new char[1024];//用于暂存字符
  10.                        
  11.                         //读取一组字符放到数组,并传递给书写流对象,如此循环直至文件被读取完毕
  12.                         while((fr.read(buf))!=-1){
  13.                                 fw.write(buf,0,fr.read(buf));
  14.                                 fw.flush();
  15.                         }
  16.                 }
  17.                 catch(Exception e)//捕获并处理异常
  18.                 {
  19.                         System.out.println(e.toString());
  20.                 }
  21.                 finally    //关闭流资源
  22.                 {
  23.                         try
  24.                         {
  25.                                 if(fr!=null)
  26.                                         fr.close();
  27.                                 if(fw!=null)
  28.                                         fw.close();
  29.                         }
  30.                         catch(Exception e)
  31.                         {
  32.                                 System.out.println(e.toString());
  33.                         }
  34.                 }
  35.         }

  36. }
复制代码


运行提示我角标越界异常 吗,why??????
作者: 15001162522    时间: 2015-10-6 23:33
我反应过来了 ~~~~~~~已想明白~~~~~
作者: 拂袖叙五代    时间: 2015-10-7 00:48
try
                        {
                                if(fr!=null)
                                        fr.close();
                                if(fw!=null)
                                        fw.close();
                        }
                        catch(Exception e)
                        {
                                System.out.println(e.toString());
                        }

提醒楼主这里最好写两个try, 因为如果第一个close如果出异常后,第二个close就跑不到
作者: 阿加斯冬季    时间: 2015-10-7 01:13
15001162522 发表于 2015-10-6 23:33
我反应过来了 ~~~~~~~已想明白~~~~~

到底是为啥啊?
作者: 15001162522    时间: 2015-10-7 11:30
拂袖叙五代 发表于 2015-10-7 00:48
try
                        {
                                if(fr!=null)

哦哦  太对了   多谢提醒
作者: 15001162522    时间: 2015-10-7 11:34
阿加斯冬季 发表于 2015-10-7 01:13
到底是为啥啊?
  1. while((fr.read(buf))!=-1){
  2.                                 fw.write(buf,0,fr.read(buf));
  3.                                 fw.flush();
复制代码


问题出在这部分,应该定义一个int len =fr.read(buf) ;后面的fw.write(buf,0,read(buf))应写为fw.write(buf,0,len)。。。。
不过不定义len,相当于又调用了一次read(buf)方法,懂了吗?
作者: 阿加斯冬季    时间: 2015-10-7 15:56
15001162522 发表于 2015-10-7 11:34
问题出在这部分,应该定义一个int len =fr.read(buf) ;后面的fw.write(buf,0,read(buf))应写为fw.write ...

哦,懂了懂了。。。在一个循环内调用了两次




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2