黑马程序员技术交流社区

标题: 关闭BufferedReader就无需关闭FileReader的疑问! [打印本页]

作者: 少年闰土    时间: 2015-6-6 16:16
标题: 关闭BufferedReader就无需关闭FileReader的疑问!
在学习FileReader和BufferedReader后,老师写的一段代码如下:
                FileReader fileRdr = null;
                BufferedReader bufRdr = null;
                try {
                        //打开文件读取流
                        fileRdr = new FileReader("F:\\demo.txt");
                        //使读取流使用缓冲技术
                        bufRdr = new BufferedReader(fileRdr);
                        String line = null;
              
                        //从缓冲区按行读取内容
                        while (null != (line = bufRdr.readLine())) {
                                System.out.println(line);
                        }
                }
                catch (FileNotFoundException e) {
                        System.out.println("file not found");
                }
                catch (IOException e) {
                        System.out.println("IOException");
                }
                finally {
                        try {
                                if (bufRdr != null) {
                                        bufRdr.close();
                                }
                        }
                        catch (IOException e) {
                                System.out.println("BufferedReader close IOException" + e.getStackTrace());
                        }
                }

    FileReader创建读取流,BufferedReader给读取流加入缓冲区。然而,在读取完文件后只关闭了BufferedReader没有关闭FileReader,老师包括API文档解释是BufferedReader中close()会关闭流并释放资源,那么FileReader就会在BufferedReader关闭时关闭。不知道这样理解对否?
    但是有个疑问假如在bufRdr = new BufferedReader(fileRdr);时出现异常bufRdr就会为null,那么代码最终会在finally中检测bufRdr为null就不会执行bufRdr.close();这时候执行fileRdr = new FileReader("F:\\demo.txt");时打开的读取流就没有被关闭,这个问题是怎么解决的呢?



作者: fenglinluomu    时间: 2015-6-6 16:23
BufferedReader 关闭的就是FileReader的资源。这是装饰设计模式,装饰类要接收一个被装饰类的实例,所以BufferedReader内部的close方法其实就是调用的传进来的FileReader对象的close方法。
作者: 少年闰土    时间: 2015-6-6 16:26
fenglinluomu 发表于 2015-6-6 16:23
BufferedReader 关闭的就是FileReader的资源。这是装饰设计模式,装饰类要接收一个被装饰类的实例,所以Buf ...

恩 这是第一个问题的答案,第二个问题呢?你是怎么理解的?:D
作者: fenglinluomu    时间: 2015-6-6 16:31
本帖最后由 fenglinluomu 于 2015-6-6 16:36 编辑

第二个问题……我也是醉了,如果fileRdr引用成功指向一个实例,那么bufRdr = new BufferedReader(fileRdr)这句代码是不可能出现异常的。
你可以查看api文档里BufferedReader的构造描述,它是不抛异常的。:lol

作者: 少年闰土    时间: 2015-6-6 16:39
fenglinluomu 发表于 2015-6-6 16:31
第二个问题……我也是醉了,如果fileRdr引用成功指向一个实例,那么bufRdr = new BufferedReader(fileRdr) ...

我看过,构造函数是不抛异常,这就意味着不会出错、。难道是我想的有点多了?哈哈  谢谢了




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