Java自动关闭流

背景

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

自动关闭流例子

import java.io.*;

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

 

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

打开该源码文件对应的class文件反编译后可以看到

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

public class AutoCloseTest {
    public AutoCloseTest() {
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("t.txt"));
        Throwable var2 = null;

        try {
            PrintStream pr = new PrintStream(new FileOutputStream("a.txt"));
            Throwable var4 = null;

            try {
                System.out.println(br.readLine());
                pr.println("我是要成为海贼王的男人");
            } catch (Throwable var27) {
                var4 = var27;
                throw var27;
            } finally {
                if (pr != null) {
                    if (var4 != null) {
                        try {
                            pr.close();
                        } catch (Throwable var26) {
                            var4.addSuppressed(var26);
                        }
                    } else {
                        pr.close();
                    }
                }

            }
        } catch (Throwable var29) {
            var2 = var29;
            throw var29;
        } finally {
            if (br != null) {
                if (var2 != null) {
                    try {
                        br.close();
                    } catch (Throwable var25) {
                        var2.addSuppressed(var25);
                    }
                } else {
                    br.close();
                }
            }

        }

    }
}

 

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

为什么会自动关闭

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

 

 

总结

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

 

posted @ 2021-06-10 16:05  wang_longan  阅读(2245)  评论(0编辑  收藏  举报