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

© 小黑子 中级黑马   /  2014-10-10 11:44  /  1443 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小黑子 于 2014-10-10 11:46 编辑

写了一个用缓冲区,将一个文本复制到另一个文本的小代码
  1. import java.io.FileReader;
  2. import java.io.FileWriter;
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.IOException;

  6. class BufferedDemo
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 FileReader fr = null;
  11.                 FileWriter fw = null;
  12.                 BufferedReader br = null;
  13.                 BufferedWriter bw = null;

  14.                 try
  15.                 {
  16.                         fr = new FileReader("RuntimeDemo.java");
  17.                         fw = new FileWriter("F:/RuntimeDemo.txt");
  18.                         br = new BufferedReader(fr);
  19.                         bw = new BufferedWriter(fw);

  20.                         for(String line;(line=br.readLine())!=null;)
  21.                         {
  22.                                 bw.write(line);
  23.                                 bw.newLine();
  24.                                 bw.flush();
  25.                         }

  26.                 }
  27.                 catch (IOException ioe)
  28.                 {
  29.                         throw new RuntimeException("文件读写异常");
  30.                 }
  31.                 finally
  32.                 {
  33.                         if (fr!=null)
  34.                         {
  35.                                 try
  36.                                 {
  37.                                         fr.close();
  38.                                 }
  39.                                 catch (IOException ioe)
  40.                                 {
  41.                                         throw new RuntimeException("读文件关闭异常");
  42.                                 }
  43.                         }
  44.                         if (bw!=null)
  45.                         {
  46.                                 try
  47.                                 {
  48.                                         br.close();
  49.                                 }
  50.                                 catch (IOException ioe)
  51.                                 {
  52.                                         throw new RuntimeException("写文件关闭异常");
  53.                                 }
  54.                         }
  55.                 }
  56.         }
  57. }

复制代码


我想知道,这个流关闭的时候到底怎么关呢?因为建立了四个流对象。
所以,有没这种可能:fr对象确实建立了,而br建立失败呢?
这样的话,finally中用下边代码关闭流是不是会更合适(因为我理解的是:br.close()调用的就是fr.close(),所以是不是,用fr关了,br就不用关了?)?
finally
{
                           if (fr!=null)
                           {
                                try
                                {
                                        fr.close();
                                }
                                catch (IOException ioe)
                                {
                                        throw new RuntimeException("读文件关闭异常");
                                }
                        }
}

======================================================
我想知道最专业的处理方式在建立对象上改进还是在关闭流上改进?是如何改的呢?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

6 个回复

倒序浏览
不要关fr和fw,关了br和bw就好了,它们自己并未调用底层资源,调用关闭方法时实际上就是在调用所接收的流对象,也就是fr和fw

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
水竹 发表于 2014-10-10 11:53
不要关fr和fw,关了br和bw就好了,它们自己并未调用底层资源,调用关闭方法时实际上就是在调用所接收的流对 ...

那万一 br和bw没创建成功,而fr和fw却创建成功了怎么办?
回复 使用道具 举报
路过。。。
回复 使用道具 举报
小黑子 发表于 2014-10-10 17:08
那万一 br和bw没创建成功,而fr和fw却创建成功了怎么办?

不会出现这种情况的,因为BufferedReader和BufferedWriter本身并不涉及IO操作,所以你说的问题并不存在。
回复 使用道具 举报
水竹 发表于 2014-10-10 17:38
不会出现这种情况的,因为BufferedReader和BufferedWriter本身并不涉及IO操作,所以你说的问题并不存在。 ...

Soga,是这个样子啊,谢谢哈。
回复 使用道具 举报
水竹 中级黑马 2014-10-10 17:44:50
7#
小黑子 发表于 2014-10-10 17:41
Soga,是这个样子啊,谢谢哈。

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