Closeable、AutoCloseable和try-with-resources语句

本文讲述了作者在学习Java过程中,发现旧的教学视频中关于输入输出流关闭的方法已经过时。Java 7开始支持try-with-resources语句,可以自动关闭实现了AutoCloseable接口的资源,避免了在finally块中手动调用close()。作者通过示例代码展示了这一特性的使用,并强调了理解官方文档的重要性,尤其是对于编程语言规范的理解。
摘要由CSDN通过智能技术生成

“要养成输入流、输出流用完后关闭的习惯。”
之前学习Java时牢牢记住了视频里老师的这句话,然后之后用Java操作输入、输出流的时候都这样:

try{

}catch(){

}finally{
	//在这里手动调用close()关闭流
}

包括网络上的很多文章也是这样写,这让我一直以为是这样的。

直到今天在仔细研究IO类源代码的时候发现字节流的InputStreamOutputStream和字符流的WriterReader都实现了Closeable接口,而Closeable接口继承了AutoCloseable接口(Java SE 7(1.7)新增),网上查阅得知实现AutoCloseable接口后,便可通过try-catch-resources语句创建资源,并且会在try{}执行完之后自动调用close()方法释放资源,而无需手动调用,。例如,自己创建一个T类实现Closeable接口,实现close()方法:
在这里插入图片描述
再使用如下的try-catch结构创建T的对象:
在这里插入图片描述
输出结果显示,在并未调用close()方法的情况下,执行完try{}后,自动调用了close()方法。而不再需要在finally{}中手动调用close()
在这里插入图片描述
哎,想起来也是啊,我是2016年初看的Java‘教学视频,我再去翻视频看老师用的Java版本,结果是2006年发布的Java SE 6(1.6),视频录制时间是2011年2月,而2011年7月发布的Java SE 7支持了这种写法……
害得我close()了这么久。看来以后看教学视频要尽量选新的了,不过奇怪网上那么多文章都是手动close()

try-catch-resources语句是我在网上搜索到的,之前没有听过这种写法,于是我打开Java官方的Java Language Specification文档看看最权威的语法规范:点此查看

A try-with-resources statement is parameterized with variables (known as resources) that are initialized before execution of the try block and closed automatically, in the reverse order from which they were initialized, after execution of the try block. catch clauses and a finally clause are often unnecessary when resources are closed automatically.
try-with-resources 语句使用变量(称为资源)参数化,这些变量在执行 try 块之前被初始化,并在执行 try 块之后按照它们被初始化的相反顺序自动关闭。 当资源自动关闭时,通常不需要 catch 子句和 finally 子句。

The resource specification denotes the resources of the try-with-resources statement, either by declaring local variables with initializer expressions or by referring to existing variables.
资源规范表示 try-with-resources 的资源声明,或者通过使用初始化表达式声明局部变量或通过引用现有变量。

按照文档的说法编写如下程序:
在这里插入图片描述
运行后输出,正如文档中所说,按照try()里变量反向从右到左调用了close()方法。
在这里插入图片描述
而不是按照变量初始化的顺序,修改一下代码:
在这里插入图片描述
运行结果说明不是按照变量初始化的顺序反向调用close()
在这里插入图片描述
翻译里说“按照它们被初始化的相反顺序自动关闭”,所以有时候使用翻译会造成歧义,特别是像这种严谨的官方文档,就需要一个词一个词的理解。

文档下文就规定了try()里的变量必须是AutoCloseable的子类型,即间接实现了此接口。这就与上文讲的一样了。

The type of a local variable declared in a resource specification, or the type of an existing variable referred to in a resource specification, must be a subtype of AutoCloseable, or a compile-time error occurs.
资源规范中声明的局部变量的类型,或资源规范中引用的现有变量的类型,必须是 AutoCloseable 的子类型,否则会发生编译时错误。

哎,更多细节以后再慢慢研究吧,全英文的专业文档看起来真头大,只恨英语水平不够,要好好学英语了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
try-with-resources语句Java SE 7及其后续版本中引入的一种语法结构。它允许程序员在代码块中声明一个或多个资源,并确保在代码块执行完毕后自动关闭这些资源。资源必须实现Java.lang.AutoCloseable接口,包括所有实现了java.io.Closeable接口的对象。使用try-with-resources语句,可以避免手动关闭资源的繁琐工作,同时保证资源的正确关闭。语法结构如下所示: ```java try (ResourceType resource1 = new ResourceType(); ResourceType resource2 = new ResourceType()) { // 使用资源的代码块 } catch (ExceptionType e) { // 异常处理代码 } finally { // 最终执行的代码 } ``` 在try-with-resources语句中,资源的声明放在try关键字后的括号内,使用分号分隔多个资源的声明。资源的作用域与代码块的作用域相同,并且在代码块执行完毕后自动关闭资源。如果在资源关闭过程中发生异常,会先执行catch块中的代码,然后再执行finally块中的代码。 使用try-with-resources语句的主要好处是简化了资源的关闭操作,并且可以更容易地处理异常。在Java 9中,还对try-with-resources进行了改进,使得使用起来更加方便和简洁。 参考资料: Java SE 7中的try-with-resources语句,Oracle官方文档 JDK 9中的改进try-with-resources语句Java Papers网站<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值