今天学习JDBC的时候查看了接口Statement的executeQuery()方法的时候偶然发现了一个新的接口:

看到红笔圈出的那句话当时没反应过来,才知道是接口的多继承,但是后面的那个接口并没有见过;

然后再网上找答案的时候突然找到了关于AutoCloseable的用法顾名思义就是自动关闭的意思,这里我给大家贴出有关它的讲解,感觉自己受益匪浅啊,最近在学jdbc学完就开始去找工作了;

自动化资源管理(即ARM)能力是Java 7特有的,目前使用Java 6的朋友在编译时很多库都需要重新编译以适应Java 6的需要。其目的在于当遇到错误或是成功执行完代码块后能够轻松处理好外部资源。

  Project Coin的一个突出特点就是具备了自动化资源管理(即ARM)能力,这个能力是Java 7特有的,目前使用Java 6的朋友在编译时很多库都需要重新编译以适应Java 6的需要。其目的在于当遇到错误或是成功执行完代码块后能够轻松处理好外部资源。其最初实现位于Open JDK中。考虑如下繁琐的文件拷贝操作,代码来自于Java Bytestream教程:[code]FileInputStream
in = null;

  FileOutputStream out = null;

  try {

  in = new FileInputStream("xanadu.txt");

  out = new FileOutputStream("outagain.txt");

  int c;

  while ((c = in.read()) != -1)

  out.write(c);

  } finally {

  if (in != null)

  in.close();

  if (out != null)

  out.close();

  }[/code] 上面不仅有大量的样版代码,而且InputStream.close()的文档表明它会抛出IOException(OutputStream也存在类似的异常,无论何种情况,要想成功编译这些代码,要么在外面加上catch块,要么将异常继续往外抛)。

  try-catch-finally块的语义范围还要求变量FileInputStream in与FileOutputStream out声明在块的外面(如果定义在try块内,那么catch块与finally块就访问不到了)。

  为了减少上面这些样版代码并且收紧块中所用的资源范围,Java语言在try块中新增了一些内容。最初的try-with-resources块(或者叫做ARM块)规范已经拥有实现了,随后该规范被纳入到JDK 7 build 105中。

  新的接口java.lang.AutoCloseable被加到了提案API中,它只定义了一个会抛出Exception的方法close()。该接口是java.io.Closeable的父接口,这意味着所有的InputStream与OutputStream都会自动享受到该行为所带来的好处。此外,FileLock与ImageInputStream也实现了AutoCloseable接口。

  这样,上面的代码就可以这样来写:[code]try (

  FileInputStream in = new FileInputStream("xanadu.txt");

  FileOutputStream out = new FileOutputStream("outagain.txt")

  ) {

  int c;

  while((c=in.read()) != -1 )

  out.write();

  }[/code]在try块的末尾,无论是正常结束还是抛出了异常,out与in资源都会自动调用close()方法。此外,与之前示例不同的是out.close()与in.close()保证会执行(在之前的示例中,一旦in.close()方法抛出了异常,随后的out.close()方法就没有机会执行了)。

  关于这种方式,还有一些微妙之处值得我们注意:

  ◆如上代码所示,在资源部分中,最后一个资源后面是不允许使用分号的。

  ◆资源块使用()分隔,而不是常见的{},以此将其与现有的try块分隔开来。如果存在资源块,那么里面必须要包含一个或多个资源定义语句。

  ◆每个资源定义具有如下形式:type var = expression;在资源块中不能使用通常的语句。

  ◆资源都是隐式final的,也就是说即便没有使用final,这些资源也都是final的。如果尝试为资源变量赋值会得到一个编译期错误。

  ◆资源必须是AutoCloseable的子类型,如果不是的话会得到一个编译期错误。

  ◆资源关闭的顺序与定义的顺序正好相反。换句话说,在上面的代码示例中,out.close()要先于in.close()得到调用。这么做可以构建嵌套的流,然后从外向内关闭流,这要比按顺序关闭更好(也就是说,可以在底层的流关闭前先清空缓存)。

  ◆每个块可以生成n+1个异常,n是资源的数量。这出现在代码主体抛出了异常,然后每个资源关闭语句也都抛出异常的情况下。在这种情况下,代码主体的异常将被抛出,但其他的异常将会被添加到异常的抑制列表(suppressed exception list)中。可以通过getSuppressedExceptions()方法访问这些异常信息。

  ◆异常堆栈追踪信息可以带有Suppressed前缀:在这些情况下,序列化的Throwable格式也有所不同(如果Java 6客户端调用了远程Java 7运行时中的服务会出现这个问题,反之亦然)。

  ◆javax.swing与java.sql目前并不会加入到ARM中;类需要继承AutoCloseable才能为ARM所用。JDBC 4.1如果能够成为JDK 7的一部分,那么它也将支持ARM,但具体时间尚未确定。

  能够移除Java开发者每天都要编写的样版代码对生产力的提升是个促进,虽然JDK 7具备了这种能力,但有时需要在编写代码前利用这种能力。很多库都需要重新编译以适应Java 6的需要,无论何时,只要使用了自动化资源管理,那么它就只能用于使用-target 7编译的代码。等到Java 6寿终正寝,并且Java 8发布后,使用ARM就会成为自然而然的事情了。

AutoCloseable的用法的更多相关文章

  1. Java中try()...catch()用法

    在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类似IO流的处理,要在finally部分关闭IO流,当然这 ...

  2. Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream

    1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...

  3. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  4. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  5. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  6. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  7. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  8. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  9. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

随机推荐

  1. Chapter6_访问权限控制_类的访问权限

    在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...

  2. python神器之fabric

    官网:http://www.fabfile.org/ 中文站点:http://fabric-chs.readthedocs.io/zh_CN/chs/ Fabirc是基于python实现的SSH命令行 ...

  3. C#实现简单的RPC

    demo地址:https://pan.baidu.com/s/1PeTdV2V9DF87jZTHdz4CyA 提取码:n2qm 参考地址:https://github.com/neuecc/Magic ...

  4. 解答VS2013编译报错不准确是什么原因

    1.当程序在错误时,VS2013编译报出的错误有时不会一起全部报出,而是按错误的英文首字母逐个报出的 2.如果报错的信息双击点过去查看时又发现无明显错误问题时,这个这个时候可以是VS编译的缓存问题,这 ...

  5. [leetcode268]Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  6. Touch365现已上架!

    欢迎体验由武宇亭.诸子轩.梁国伟.张裕浩.孔维喆.邱亚威同学开发的创意照片浏览软件Touch365,现已上架Microsoft官方商城! https://www.microsoft.com/zh-cn ...

  7. JavaScriptDOM

    DOM简介 1.HTML DOM:网页被加载时,浏览器会创建文档对象模型 2.DOM操作HTML:改变HTML的元素.属性.CSS样式.对所有事件作出反应 DOM操作HTML 1.改变HTML输出流 ...

  8. Eclipse的application.properties文件输出中文成unicode编码

    今天添application.properties时,无法输入中文,输入的中文直接变成了unicode的编码形式.原因是Eclipse的Spring Properties文件的默认编码为iso-885 ...

  9. springboot的拦截器Interceptor的性质

    Interceptor在springboot2.x版本的快速入门 实现HandlerInterceptor的接口,并重载它的三个方法:preHandle.postHandle.afterComplet ...

  10. 基于fpga的vga学习(3)

    本次学习如何通过vga发送数字.文字.字母, 首先利用建模软件,将想要发送的数据通过数学建模转换,这里我用的软件是PCtoLCD,具体效果如下 这里可以看出,建模将数据装换成0和1,一个字母用16x8 ...