告别复杂的流关闭

释放双眼,带上耳机,听听看~!

一、引言

也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实java7引入了自动关闭流机制,只是我们未使用而已。

二、自动关闭流例子

public class AutoCloseTest {
    public static void main(String[] args) throws IOException {
        //将打开流代码放到try中
        try (
                BufferedReader br = new BufferedReader(
                        new FileReader(\"teacher.txt\"));
                PrintStream pr = new PrintStream(new FileOutputStream(\"a.txt\"))
        ) {
            //使用两个资源
            System.out.println(br.readLine());
            pr.println(\"我是要成为海贼王的男人\");
        }
    }
}

我们直接将打开的流对象放到try的圆括号中,这样当流使用完毕时,会自动将流进行关闭。这样不仅省事而且避免了自行关闭可能带来的错误。

三、探究原理

这么神奇吗?让我们来掀开这层神秘面纱,看看是何方妖孽在此“作祟”。通过jd-gui工具,我们打开

class文件看看。

public class AutoCloseTest
{
  public static void main(String[] args)
    throws IOException
  
{
    BufferedReader br = new BufferedReader(new FileReader(\"teacher.txt\"));Throwable localThrowable6 = null;
    try
    {
      PrintStream pr = new PrintStream(new FileOutputStream(\"a.txt\"));Throwable localThrowable7 = null;
      try
      {
        System.out.println(br.readLine());
        pr.println(\"我是要成为海贼王的男人\");
      }
      catch (Throwable localThrowable1)
      {
        localThrowable7 = localThrowable1;throw localThrowable1;
      }
      finally {}
    }
    catch (Throwable localThrowable4)
    {
      localThrowable6 = localThrowable4;throw localThrowable4;
    }
    finally
    {
      if (br != null) {
        if (localThrowable6 != null) {
          try
          {
            br.close();
          }
          catch (Throwable localThrowable5)
          {
            localThrowable6.addSuppressed(localThrowable5);
          }
        } else {
          br.close();
        }
      }
    }
  }
}

厉害了,jvm帮我们做的更好,大家可以参考下之前自己写的关闭流程有没有问题。自动关闭流程也是一样的,先关闭后打开的流,因为如果先关闭先打开的,如果后打开的在使用先打开的,这就会引发异常。

为什么会自动关闭呢?

这是因为java7引入了一个AutoCloseable接口。几乎java自带的所有使用到流的都实现了这个接口。下面是继承图。

告别复杂的流关闭

四、总结

我们可以通过使用java7引入的自动关闭机制,将实现了AutoCloseable接口的流放到try块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

A股三大股指全线走弱成交量继续萎缩 北向资金净流出超过50亿元

2020-11-9 4:48:03

随笔日记

Java断点续传(基于socket与RandomAccessFile的简单实现)

2020-11-9 4:48:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索