zoukankan      html  css  js  c++  java
  • 告别复杂的流关闭

    一、引言

    也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实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块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。

  • 相关阅读:
    使用excel2003中的solver解决最优化问题
    图的邻接表存储方式的建立
    LINUX下使用VI
    LINUX下基本命令
    应用程序各对象创建的顺序
    zookeeper常遇错误详解
    MapReduce_partition
    MapReduce_TopK
    MapReduce_MaxValue
    Hbase用java基础操作
  • 原文地址:https://www.cnblogs.com/9dragon/p/10839472.html
Copyright © 2011-2022 走看看