zoukankan      html  css  js  c++  java
  • Try-with-resources

    资源管理与 Try-Catch-Finally,旧风格

    在 java 7 之前,管理需要明确关闭的资源是相当繁琐的。

    看看下面的方法,它读取一个文件并将其打印到 System.out 中:

    private static void printFile() throws IOException {
        InputStream input = null;
    
        try {
            input = new FileInputStream("file.txt");
    
            int data = input.read();
            while(data != -1){
                System.out.print((char) data);
                data = input.read();
            }
        } finally {
            if(input != null){
                input.close();
            }
        }
    }

    在上面的代码中有四处可能抛出异常new FileInputStream("file.txt");int data = input.read();data = input.read();input.close();

    不管try块是否抛出异常,finally块总是被执行。也就是说,无论try快种发生了什么,InputStream都将被关闭。然而如果关闭失败,close()方法也有可能抛出异常。

    思考一下,如果try块内抛出一个异常,finally块也抛出一个异常,你认为哪个异常会在调用堆栈中传递。

    finally块中抛出的异常将会在调用堆栈中传递,即使try块抛出的异常可能与传递相关。

    Try-with-resources

    在 Java 7 中你可以使用 Try-with-resources 结构来编写上面示例中的代码:

    private static void printFileJava7() throws IOException {
    
        try(FileInputStream input = new FileInputStream("file.txt")) {
    
            int data = input.read();
            while(data != -1) {
                System.out.print((char) data);
                data = input.read();
            }
        }
    }

    注意看方法的第一行:

    try(FileInputStream input = new FileInputStream("file.txt")) {

    这是一个try-with-resources结构。在 try 关键字后面的括号中声明并实例化FileInputStream

    当 try 块结束时,FileInputStream将自动关闭。因为FileInputStream实现了java.lang.AutoCloseable接口,所有实现改接口的类都可以使用try-with-resources结构。

    如果一个异常从try-with-resources块中抛出,并且当FileInputStream被关闭时(调用close()时),在 try 块中的异常江北抛出到外部世界,FileInputStream关闭时抛出的异常被抑制。这与前面的示例情况正好相反。

    管理多个资源

    你可以在try-with-resources块中使用多个资源,并将它们全部自动关闭。下面是一个示例:

    private static void printFileJava7() throws IOException {
    
        try(  FileInputStream input = new FileInputStream("file.txt");
              BufferedInputStream bufferedInput = new BufferedInputStream(input)
        ) {
            int data = bufferedInput.read();
            while(data != -1){
                System.out.print((char) data);
                data = bufferedInput.read();
            }
        }
    }

    这个例子在括号中创建了两个资源,一个FileInputStream和一个BufferedInputStream
    当执行完 try 块时,这两个块都将被关闭。

    这些资源将按照他们在括号内创建/列出顺序相反的顺序关闭,也就是先关闭BufferedInputStream,然后关闭FileInputStream

    自定义 AutoClosable 实现

    try-with-resources结构不仅适用于 java 内置类,你也可以在自己的类中实现java.lang.AutoCloseable接口,便可使用try-with-resources接口。

    AutoClosable接口中只有一个名为close()的方法,接口如下所示:

    public interface AutoClosable {
        public void close() throws Exception;
    }

    任何实现此接口的类都可以与try-with-resources一起使用。下面是一个简单的示例:

    public class MyAutoClosable implements AutoCloseable {
    
        public void doIt() {
            System.out.println("MyAutoClosable doing it!");
        }
    
        @Override
        public void close() throws Exception {
            System.out.println("MyAutoClosable closed!");
        }
    }

    doIt()方法不是AutoClosable接口的一部分,它之所以存在是因为我们想要做的不仅仅是关闭对象。

    下面是MyAutoClosabletry-with-resources结构一起使用的示例:

    private static void myAutoClosable() throws Exception {
    
        try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
            myAutoClosable.doIt();
        }
    }

    当我们调用myAutoClosable()方法时,输出如下:

    MyAutoClosable doing it!
    MyAutoClosable closed!

    正如你所看到的,无论这些资源是你自己所创建还是 Java 的内置组件,try-with-resources都是确保正确关闭try-catch块内部使用的资源的一种强大的方式。

  • 相关阅读:
    你若不努力,整个世界将与你无关
    【规范】yii2 resetful 授权验证
    DFT到FFT的理解
    【统计学】6.统计量及其抽样分布
    【统计学】5.概率与概率分布
    【统计学】4.数据的概括性度量
    【统计学】3.数据的图表展示
    【统计学】2.数据的搜集
    【统计学】1.导论
    小程序API(1.19)利用API函数设置标签栏的方法
  • 原文地址:https://www.cnblogs.com/deityjian/p/11424559.html
Copyright © 2011-2022 走看看