1.介绍

从Java7诞生了try-with-resources,这家伙可以在资源使用完后实现自动关闭回收。想想我们之前打开一个文件或流对象用完咋整的,是不是finally语句块中手动close的。

当然这类可自动关闭的资源前提是必须实现了AutoCloseable接口。

2.如何使用?

拿PrintWriter对象举例,资源必须在try结构中声明和初始化:

  1. try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
  2. writer.println("Hello World");
  3. } catch (FileNotFoundException e) {
  4. e.printStackTrace();
  5. }

看下JDK1.8中PrintWriter的定义:

All Implemented Interfaces:

Closeable, Flushable, Appendable, AutoCloseable

3.使用try-with-resources替代try-catch-finally

  1. Scanner scanner = null;
  2. try {
  3. scanner = new Scanner(new File("test.txt"));
  4. while (scanner.hasNext()) {
  5. System.out.println(scanner.nextLine());
  6. }
  7. } catch (FileNotFoundException e) {
  8. e.printStackTrace();
  9. } finally {
  10. if (scanner != null) {
  11. scanner.close();
  12. }
  13. }
  • 下面是try-resources
  1. try (Scanner scanner = new Scanner(new File("test.txt"))) {
  2. while (scanner.hasNext()) {
  3. System.out.println(scanner.nextLine());
  4. }
  5. } catch (FileNotFoundException fnfe) {
  6. fnfe.printStackTrace();
  7. }

4.同时使用多个资源

可以在一个try-with-resources块中用分号分隔以声明多个资源。例如:

  1. try (Scanner scanner = new Scanner(new File("testRead.txt"));
  2. PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
  3. while (scanner.hasNext()) {
  4. writer.print(scanner.nextLine());
  5. }
  6. }

5.自定义一个实现了AutoCloseable接口的资源

前提是要实现Closeable或AutoCloseable接口,同时重写close方法。例如:

  1. public class MyResource implements AutoCloseable {
  2. @Override
  3. public void close() throws Exception {
  4. System.out.println("Closed MyResource");
  5. }
  6. }

6.资源的关闭顺序是怎样的?

这里遵循的是:最先被定义/获取的资源最后被关闭。以下为例:

  • 资源1
  1. public class AutoCloseableResourcesFirst implements AutoCloseable {
  2. public AutoCloseableResourcesFirst() {
  3. System.out.println("Constructor -> AutoCloseableResources_First");
  4. }
  5. public void doSomething() {
  6. System.out.println("Something -> AutoCloseableResources_First");
  7. }
  8. @Override
  9. public void close() throws Exception {
  10. System.out.println("Closed AutoCloseableResources_First");
  11. }
  12. }
  • 资源2
  1. public class AutoCloseableResourcesSecond implements AutoCloseable {
  2. public AutoCloseableResourcesSecond() {
  3. System.out.println("Constructor -> AutoCloseableResources_Second");
  4. }
  5. public void doSomething() {
  6. System.out.println("Something -> AutoCloseableResources_Second");
  7. }
  8. @Override
  9. public void close() throws Exception {
  10. System.out.println("Closed AutoCloseableResources_Second");
  11. }
  12. }
  • 测试
  1. private void orderOfClosingResources() throws Exception {
  2. try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
  3. AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
  4. af.doSomething();
  5. as.doSomething();
  6. }
  7. }

输出:

Constructor -> AutoCloseableResources_First
Constructor -> AutoCloseableResources_Second
Something -> AutoCloseableResources_First
Something -> AutoCloseableResources_Second
Closed AutoCloseableResources_Second
Closed AutoCloseableResources_First

7.Java9中的改进

来到java9我们可以在try-with-resources块中使用final或effectively final变量:

  1. final Scanner scanner = new Scanner(new File("testRead.txt"));
  2. PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
  3. try (scanner;writer) {
  4. // omitted
  5. }

如上,scanner变量声明为final,而writer变量没有显式声明final,但是很明显它在第一次赋值后并没有做其它改变,java8开始自动认为其为final变量。这一特性也就是effectively final。

Java中的Try with Resources语句介绍的更多相关文章

  1. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  2. java中的compareto方法的详细介绍

    java中的compareto方法的详细介绍 Java Comparator接口实例讲解(抽象方法.常用静态/默认方法) 一.java中的compareto方法 1.返回参与比较的前后两个字符串的as ...

  3. Java中Synchronized的用法(简单介绍)

    简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...

  4. java中的包以及内部类的介绍

    1:形式参数和返回值的问题(理解)    (1)形式参数:        类名:需要该类的对象        抽象类名:需要该类的子类对象        接口名:需要该接口的实现类对象    (2)返 ...

  5. 原来java中也有类似goto语句的标签啊--java label标签

    http://blog.sina.com.cn/s/blog_6d5354cd0100xjg7.html ——————————————————————————————————————————————— ...

  6. java中equals以及==的用法(简单介绍)

    简单介绍 equals方法是java.lang.Object类的方法 有两种用法说明: 一.对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. 1.“==”比较两 ...

  7. java中Executor、ExecutorService、ThreadPoolExecutor介绍(转)

    1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**     * Executes th ...

  8. java中Executor、ExecutorService、ThreadPoolExecutor介绍

    源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**      * Executes the given c ...

  9. java中异常处理finally和return语句的执行顺序

    finally代码块的语句在return之前一定会得到执行 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存, ...

  10. Java中if else条件判断语句的执行顺序

    学习目标: 掌握 if else 条件判断的使用 学习内容: 1.if语法 if(boolean表达式) { 语句体; } if后面的{}表示一个整体-代码块,称之为语句体,当boolean表达式为t ...

随机推荐

  1. Go-并发安全map

  2. SV 并发线程

    内容 assign d = a & b; assign e = b | c; begin...end之间的语句是串行执行的 fork....join语句是并行执行的 逻辑仿真工具中的并发性 仿 ...

  3. [粘贴]TiDB Lightning 断点续传

    https://www.bookstack.cn/read/tidb-6.1-zh/tidb-lightning-tidb-lightning-checkpoints.md 大量的数据导入一般耗时数小 ...

  4. [转帖]Linux文件系统的几个性能测试软件小结

    https://developer.aliyun.com/article/297631#:~:text=Linux%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A% ...

  5. SQLServer 隔离级别的简单学习

    SQLServer 隔离级别的简单学习 背景 上周北京一个项目出现了卡顿的现象. 周末开发测试加紧制作测试发布了补丁,但是并没有好转. 上周四时跟研发訾总简单沟通过, 怀疑是隔离级别有关系.但是不敢确 ...

  6. [转帖]「Linux性能调优」磁盘I/O队列调度策略

    https://zhuanlan.zhihu.com/p/450329513 傻瓜化说明 简单地说,对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字 ...

  7. [转贴]中国铁塔发布2020年中期财报:营收、利润双增,高效支撑5G规模建设

      中国铁塔发布2020年中期财报:营收.利润双增,高效支撑5G规模建设 https://tech.sina.com.cn/roll/2020-08-11/doc-iivhuipn8046256.sh ...

  8. 庖丁解牛:最全babel-plugin-import源码详解

    庖丁解牛:最全 babel-plugin-import 源码详解 序言:在用 babel-plugin 实现按需加载一文中笔者用作用域链思路实现了按需加载组件.此思路是统一式处理,进入 ImportD ...

  9. ElasticSearch降本增效常见的方法 | 京东云技术团队

    Elasticsearch在db_ranking 的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位. 随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少.那如 ...

  10. Docker搭建SvnServer

    下载svn-server官方镜像 docker pull garethflowers/svn-server 运行svn-server容器 docker run -v /home/svn:/var/op ...