java7 try-with-resources 很香

简介: java7 try-with-resources 很香

Java 7为懒惰的Java开发人员带来了一些非常好的功能。尝试资源是这种功能之一,它可以减少代码行,并使代码更健壮。在本教程中,我将讨论有关此功能的内容。

1.资源清除的旧方法(在Java 7之前)

**我们长期以来一直在这样做。例如,从文件系统读取文件。代码可能看起来有所不同,但流程如下例所示:

public class ResourceManagementBeforeJava7 
{
    public static void main(String[] args) 
    {
        BufferedReader br = null;
        try
        {
            String sCurrentLine;
            br = new BufferedReader(new FileReader("C:/temp/test.txt"));
            while ((sCurrentLine = br.readLine()) != null) 
            {
                System.out.println(sCurrentLine);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (br != null)
                    br.close();
            } 
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

这些类型的代码在具有大量IO操作的应用程序代码库中非常常见。

try和catch块中的代码本质上很重要,并且具有一些特定于应用程序的逻辑。但是,终于封锁了吗?在大多数情况下,finall块只是被复制粘贴,目的是通过关闭它们来避免损坏资源。

当您有3-4个这样的资源要在单个finally块中关闭时,这些final块看起来更难看。当我们知道时,您是否不认为这些final块不必要地存在,我们必须以任何方式关闭资源而没有任何例外情况?

Java 7通过try-with-resources功能解决了这个问题。#

2.使用try-with-resources的新方法(语法示例)

现在看看在Java 7中打开和关闭资源的新方法。

public class ResourceManagementInJava7 
{
    public static void main(String[] args) 
    {
        try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt")))
        {
            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) 
            {
                System.out.println(sCurrentLine);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

有两件事需要密切注意:


  1. 文件资源(BufferedReader)以特殊方式在try块中打开(在小括号内)。
  2. finally块完全消失了。

最后但并非最不重要的一点是,代码看起来很漂亮且易于阅读。很好,对吗?但是它实际上是如何工作的?

3.实际如何运作?

在Java 7中,我们有一个新的超级接口java.lang.AutoCloseable**。该接口有一种方法:

void close() throws Exception;

Java文档建议此接口在不再需要时必须关闭的任何资源上实现。

当我们在特殊的try-with-resource块中打开任何此类AutoCloseable资源时,在try块完成后,JVM会对在“ try()”块中初始化的所有资源立即调用close()方法。

例如,BufferedReader已实现close()方法文件如下:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        in.close();
        in = null;
        cb = null;
    }
}


由于上述方法定义,当JVM调用此方法时,所有基础流或IO资源都将关闭。

4.向自定义资源添加功能

好吧,这是一个很好的资源清理设计。但是它仅适用于JDK本机类吗?没有。您也可以将其用于自定义资源。

例如,我在以下代码中创建了一个自定义资源:

public class CustomResource implements AutoCloseable 
{
    public void accessResource() {
        System.out.println("Accessing the resource");
    }
    @Override
    public void close() throws Exception {
        System.out.println("CustomResource closed automatically");
    }
}

现在,我将在示例代码中使用它:

public class TryWithCustomResource 
{
    public static void main(String[] args)
    {
        try(CustomResource cr = new CustomResource())
        {
            cr.accessResource();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
Putput in console:
Accessing the resource
CustomResource closed automatically

控制台中的输出清楚地证明,try块完成后,资源将自动关闭。

5.总结

这就是Java 7中使用try-with-resources进行自动资源管理的全部内容。让我们逐点记下重点内容:


  • 在Java 7之前,我们必须使用finally块来清理资源。最后,块不是强制性的,但是清理资源是为了防止系统损坏。
  • 使用Java 7,无需显式的资源清理。它是自动完成的。
  • 在try-with-resources块(try(…){…})中初始化资源时完成自动资源清理。
  • 由于发生了新界面AutoCloseable,因此发生了清理。try块完成后,JVM将立即调用其close方法。
  • 如果要在自定义资源中使用此功能,则必须实现AutoCloseable接口。否则程序将无法编译。
  • 您不应在代码中调用close()方法。JVM应该自动将其称为。手动调用它可能会导致意外结果。

学习愉快!



相关文章
|
7天前
|
Java 开发者
Java中的异常处理:深入探讨try-with-resources语句
【8月更文挑战第13天】在Java的世界中,异常处理是维护程序健壮性的关键环节。随着语言的发展,新的异常处理机制被引入以简化代码和提高资源管理的效率。本文将深入探讨try-with-resources语句,一种旨在简化资源管理的异常处理结构,它如何改变了我们处理资源的模式,以及这一机制背后的核心原理和实际应用中的最佳实践。
|
12天前
|
Java 数据库连接 开发者
Java中的异常处理:深入理解try-with-resources语句
在Java的编程世界中,异常处理是维护应用程序健壮性不可或缺的一环。随着语言的发展,try-with-resources语句成为了优雅管理资源的新宠。本文将带你领略这一特性的魅力,从基本用法到背后的原理,再到实际应用案例,让你对try-with-resources有一个全面而深入的理解。
|
12天前
|
Java 数据库连接 开发者
Java中的异常处理:深入探索try-with-resources语句
在Java的世界中,异常处理是代码健壮性的基石之一。随着语言的发展,新的异常处理特性不断涌现,其中最为引人注目的便是try-with-resources语句。这一创新不仅简化了资源管理,还提升了代码的可读性和效率。本文将揭开try-with-resources的神秘面纱,探讨其背后的原理、使用方法及其带来的变革。
21 3
|
26天前
|
安全 Java 数据库连接
Java中的异常处理:深入理解try-with-resources语句
在Java的异常处理领域,try-with-resources语句是一个重要的特性,它简化了资源管理并提高了代码的可读性。本文将详细探讨try-with-resources的工作原理、使用场景以及如何正确运用这一结构来优化资源管理,同时指出常见的误用情况和最佳实践。
15 0
|
3月前
|
Java 数据库连接 开发者
Java中的异常处理:探究try-with-resources
【2月更文挑战第13天】 在Java编程语言中,异常处理是确保代码健壮性和稳定性的关键机制。传统的try-catch-finally模式虽然功能强大,但在处理资源关闭方面存在一定的繁琐性和复杂度。Java 7引入的try-with-resources语句,旨在简化这一过程,通过自动管理资源的关闭过程,提高代码的可读性和可维护性。本文将深入探讨try-with-resources的工作原理、使用方式及其带来的好处,并通过对比分析展示其相比传统异常处理模式的优势。
|
3月前
|
Java 数据库连接
Java异常处理:什么是try-with-resources语句?
Java异常处理:什么是try-with-resources语句?
77 0
|
安全 Java 数据库连接
面试官,说说Java的try-with-resources
面试官,说说Java的try-with-resources
73 0
|
安全 Java
Java语法糖 : 使用 try-with-resources 语句安全地释放资源
使用 try-with-resources 语句自动关闭资源的类都实现了AutoCloseable 接口。
251 0
Java语法糖 : 使用 try-with-resources 语句安全地释放资源
|
Java
Java - 使用 try-with-resources 实现自动关闭资源
Java - 使用 try-with-resources 实现自动关闭资源
178 0
|
Java 程序员
Java 7 try-with-resources 代替 try-finally
转载自: http://www.cnblogs.com/IcanFixIt/p/8142615.html Java类库中包含许多必须通过调用close方法手动关闭的资源。
1214 0