黑马程序员技术交流社区

标题: 关于IO流的问题 [打印本页]

作者: 曾浩    时间: 2012-10-17 14:58
标题: 关于IO流的问题
本帖最后由 曾浩 于 2012-10-17 15:11 编辑

public class TestFileReader {
public static void main(String[] args) {
  
  FileReader read = null;
  try{
   read = new FileReader("Hell.txt");
   readShu(read);
      int ch = 0;
   try {
    while((ch=read.read())!= -1){
         System.out.println("ch="+(char)ch);
    }
   } catch (IOException e) {
      e.printStackTrace();
   }
  }catch(FileNotFoundException e){
  System.out.println(e);}
  finally{
   try {
    if(read!=null)
    read.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
}
public static void readShu(FileReader read){
char [] ch = new char[3];
int num = 0;
try {     
  while((num=read.read(ch))!=-1){     
      System.out.println("num="+num+"-----"+new String(ch,0,num));
       }
  
} catch (IOException e) {
   e.printStackTrace();
}finally{
  try {
   if(read!=null)
   { System.out.println("guan");
   read.close();}
  } catch (IOException e) {
      e.printStackTrace();
  }
}
}
}
为什么执行这个程序会出异常   当我不关闭 流时 程序不会有异常 只是没有往下执行了 当我关闭流时 程序就出现了异常
难道是应为调用了 readShu()方法 读取数据的指针已经读到数据的末尾了吗  如果是的话我关闭流为什么那个读取数据的指针为什么不复位呢?



作者: 陈军    时间: 2012-10-17 15:07

try {
   if(read!=null)
    System.out.println("guan"); //当读到这里时,if语句就结束了。
   read.close(); //流关闭了
  } catch (IOException e) {
      e.printStackTrace();
  }
}

你调用的函数里。已经把流关闭了,关联的对象释放。
可是后面你还在关闭流。。明显异常了
作者: 曾浩    时间: 2012-10-17 15:10
陈军 发表于 2012-10-17 15:07
try {
   if(read!=null)
    System.out.println("guan"); //当读到这里时,if语句就结束了。

不好意思那可能是我发帖子时 误删了  但是加上了那个大括号还是有异常
作者: 陈军    时间: 2012-10-17 15:12
本帖最后由 陈军 于 2012-10-17 15:39 编辑
曾浩 发表于 2012-10-17 15:10
不好意思那可能是我发帖子时 误删了  但是加上了那个大括号还是有异常


不是大括号问题。而是你关流的问题。 外部要关闭。函数内部就不该执行close()
就算你把大括号加上,因为传进了对象。read不为Null了。所以也会在函数内部执行close()。read对象也就释放了

可是你调用之后还在执行 读和关闭动作,所以就异常了
作者: 王威    时间: 2012-10-17 15:27
本帖最后由 王威 于 2012-10-17 15:37 编辑

很显然是你先调用了readShu()方法后把流关闭了,你再读当然会抛异常啊。
假如你在readShu()方法中不关闭流,那么当这个方法执行完后,读取数据的指针已经指到了末尾,你再继续用这个流继续读取当然没有数据可读的了。但是如果你在readShu()方法中关闭流,就算数据指针会复位,可是你接下来读取文件的流依然是你关闭的同一个流,当然会跑异常了。
作者: 王得新    时间: 2012-10-17 16:30
public class TestFileReader {
   
   
    public static void main(String[] args) {
  
        FileReader read = null;
        try{
            read = new FileReader("Hell.txt");
            readShu(read);//1.  这里的read不是空,已经实例化了
            int ch = 0;
            try {
                 while((ch=read.read())!= -1)//这里的read,是从readShu那里“过滤过的”,如果在readShu()函数中关了流(即执行了read.close()),
                                                            //那么这里以及下面就别再操作它了,它已经是null了,不再指向任何对象了

                 {
                    System.out.println("ch="+(char)ch);
                 }
              } catch (IOException e) {
                e.printStackTrace();
              }
        }catch(FileNotFoundException e){
             System.out.println(e);
        }finally{
             try {
                if(read!=null)
                    read.close();
             }catch (IOException e) {
                e.printStackTrace();
             }
        }
    }



    public static void readShu(FileReader read){
        char [] ch = new char[3];
        int num = 0;
        try {   
            while((num=read.read(ch))!=-1)
            {   
                System.out.println("num="+num+"-----"+new String(ch,0,num));
            }
  
        } catch (IOException e) {
            e.printStackTrace();
        }finally{//这里的蓝色部分的代码可以不需要
            try {
               if(read!=null)
               {
                   System.out.println("guan");
                       read.close();
               }
            } catch (IOException e) {
              e.printStackTrace();
            }
        }
    }
}





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