java 9增强的自动资源管理详解

KLQ 2020-09-01 15:42:55 java常见问答 6976

之前给大家介绍了java try catch finally语句之后,很多人也许都会发现,在程序使用finally块关闭资源的时候,程序会显示的非常的臃肿。

就好比下面的代码:

public static void main(String[] args)
{
    FileInputStream fis = null;
    try
    {
        fis = new FileInputStream("a.txt");
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    finally
    {
        // 关闭磁盘文件,回收资源
        if (fis != null)
        {
            try
            {
                fis.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

在Java 7之前,上面的程序当中的finally代码块是不得不写的“臃肿代码”。

为了可以解决这个问题的话,Java 7特地的新增了一个特性,这个特性提供了另外一种管理资源的方式,这种方式可以自动关闭文件。

它被叫做自动资源管理(Automatic Resource Management),该特性是在try语句上的扩展,主要释放不再需要的文件或者是其他资源。

自动资源管理替代了finally代码块,并且,优化了代码结构和提高程序可读性。

下面是具体的语法:

try (声明或初始化资源语句)
{
    // 可能会生成异常语句
}
catch (Throwable e1)
{
    // 处理异常e1
}
catch (Throwable e2)
{
    // 处理异常e1
}
catch (Throwable eN)
{
    // 处理异常eN
}

在try代码块结束的时候,自动释放资源,不再需要显式的调用close()方法,这个形式也被叫做“带资源的 try 语句”。

要注意一下:

注意

Closeable 是 AutoCloseable 的子接口,Closeable 接口里的 close() 方法声明抛出了 IOException,因此它的实现类在实现 close() 方法时只能声明抛出 IOException 或其子类;AutoCloseable 接口里的 close() 方法声明抛出了 Exception,因此它的实现类在实现 close() 方法时可以声明抛出任何异常。

下面是怎样使用自动关闭资源的try语句的示例:

public class AutoCloseTest {
    public static void main(String[] args) throws IOException {
        try (
                // 声明、初始化两个可关闭的资源
                // try语句会自动关闭这两个资源
                BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));
                PrintStream ps = new PrintStream(new FileOutputStream("a.txt"))) {
            // 使用两个资源
            System.out.println(br.readLine());
            ps.println("AAA网");
        }
    }
}

自动关闭资源的try语句相当于包含了隐式的finally块(这个finally块用于关闭资源),所以,这个try语句可以既没有catch块,也没有finally块。

Java 7 几乎把所有的“资源类”(包括文件 IO 的各种类、JDBC 编程的 Connection 和 Statement 等接口)进行了改写,改写后的资源类都实现了 AutoCloseable 或 Closeable 接口。

假如程序需要,自动关闭资源的try语句后也可以带多个catch块和一个finally块。

Java 9再次增强了这种try语句。

Java 9不要求在try后的圆括号内声明并创建资源,只需要自动关闭的资源有final修饰或者是有效的final(effectively final),Java 9允许将资源变量放在try后的圆括号内,上面程序在Java 9中可改写成下面的形式:

public class AutoCloseTest
{
    public static void main(String[] args) throws IOException
    {
        // 有final修饰的资源
        final BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));
        // 没有显式使用final修饰,但只要不对该变量重新赋值,该变量就是有效的
        final PrintStream ps = new PrintStream(new FileOutputStream("a. txt"));
        // 只要将两个资源放在try后的圆括号内即可
        try (br; ps)
        {
            // 使用两个资源
            System.out.println(br.readLine());
            ps.println("AAA网");
        }
    }
}

对于Java 9增强的自动资源管理的内容就给你介绍到这里了,更多相关常见问题,请继续来奇Q工具网进行了解吧。

推荐阅读:

java try catch语句详细介绍

java异常处理的机制及基本的语句结构详细介绍

java Error和Exception的异同介绍