关于IO流关闭的个人想法

  //注意:此处需要提前声明局部变量 并初始化为空
        //否则下方的 finally处无法使用fis.close关闭流
        FileInputStream a= null;
        BufferedInputStream b=null;
        DataInputStream c=null;
        try {
            a=new FileInputStream( "file ");
            b=new BufferedInputStream(a);
            c=new DataInputStream(b);
            //此处可以实现对流的操作 此处省略

        //此处默认会生成IOException、FileNotFoundException等异常 较为繁琐
        //可以直接捕捉父类异常 Exception
        } catch (Exception e) {
            //打印异常信息
            e.printStackTrace();
        //由于finally一定执行 故将关闭流操作放到finally语句块中
        } finally {
                    //如果文件输入流不是null 关闭流
            if(fis != null) {
                try {
                    c.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
              try {
                      b.close();
                      a.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }//错误的关闭方式;                    

        }

为什么不能在try()里面关闭流,如果说你先打开了一个流,然后你处理这个流的逻辑错了,那么其实这个流并没有被关闭,所以需要放到finally来处理关闭流的操作
为什么finally不直接关闭还要判断,因为如果你是打开流这过程就错了,那么其实这个流并没有被创建,那么其实关闭这个流其实就是错误的关闭,会报控制针异常,而这个异常不会不会被IOException 给抓住,这样就会导致后面的流不会继续关闭,可以直接用Exception去抓,这样就不用判断了

流关闭需要有顺序,从外向内,那么为什么上面那一起关闭错了呢,因为你如果没有抓住流的错误,那么比如说你在创建b流的时候错了,那么执行b.close()的时候会报错,然后报错之后就不会执行后面的a.close()了
所以其实需要每个关闭流都要抓一下

finally {
                    //如果文件输入流不是null 关闭流
            if(fis != null) {
                try {
                    c.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
              try {
                      b.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }                   
              try {
                      a.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }   
        }

其实我个人也有点疑惑,就是说假如我这个java程序就是一个一次性的,中间的逻辑其实报错就退出了,或者是没有报错正常执行完毕了,那么是否我就不需要有关闭这个流的这个操作呢,因为在我看拿来java程序已经退出了那么流其实就应该关闭了,不知道又没有大佬能回答我这个问题,百度到的都是什么流不关闭会怎么怎么样,
那假设我没有在程序里写关闭流的方法,程序已经正常运行完了,那么这个流不应该会自己关闭吗,那么我关闭流的方法到底有什么意义呢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值