Java Try-with-resources
Try-with-resources 是 java 7 中的一个新的异常处理机制,它可以更容易的正确关闭在 try-catch 块中使用的资源。
资源管理与 Try-Catch-Finally,旧风格
在 java 7 之前,管理需要明确关闭的资源是相当繁琐的。
看看下面的方法,它读取一个文件并将其打印到 System.out 中:
private static void printFile() throws IOException {
InputStream input = null;
try {
input = new FileInputStream("file.txt");
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
} finally {
if(input != null){
input.close();
}
}
}
在上面的代码中有四处可能抛出异常new FileInputStream("file.txt");
、int data = input.read();
、data = input.read();
、input.close();
。
不管try
块是否抛出异常,finally
块总是被执行。也就是说,无论try
快种发生了什么,InputStream
都将被关闭。然而如果关闭失败,close()
方法也有可能抛出异常。
思考一下,如果try
块内抛出一个异常,finally
块也抛出一个异常,你认为哪个异常会在调用堆栈中传递。
从finally
块中抛出的异常将会在调用堆栈中传递,即使try
块抛出的异常可能与传递相关。
Try-with-resources
在 Java 7 中你可以使用 Try-with-resources 结构来编写上面示例中的代码:
private static void printFileJava7() throws IOException {
try(FileInputStream input = new FileInputStream("file.txt")) {
int data = input.read();
while(data != -1) {
System.out.print((char) data);
data = input.read();
}
}
}
注意看方法的第一行:
try(FileInputStream input = new FileInputStream("file.txt")) {
这是一个try-with-resources
结构。在 try 关键字后面的括号中声明并实例化FileInputStream
。
当 try 块结束时,FileInputStream
将自动关闭。因为FileInputStream
实现了java.lang.AutoCloseable
接口,所有实现改接口的类都可以使用try-with-resources
结构。
如果一个异常从try-with-resources
块中抛出,并且当FileInputStream
被关闭时(调用close()时),在 try 块中的异常江北抛出到外部世界,FileInputStream
关闭时抛出的异常被抑制。这与前面的示例情况正好相反。
管理多个资源
你可以在try-with-resources
块中使用多个资源,并将它们全部自动关闭。下面是一个示例:
private static void printFileJava7() throws IOException {
try( FileInputStream input = new FileInputStream("file.txt");
BufferedInputStream bufferedInput = new BufferedInputStream(input)
) {
int data = bufferedInput.read();
while(data != -1){
System.out.print((char) data);
data = bufferedInput.read();
}
}
}
这个例子在括号中创建了两个资源,一个FileInputStream
和一个BufferedInputStream
。
当执行完 try 块时,这两个块都将被关闭。
这些资源将按照他们在括号内创建/列出顺序相反的顺序关闭,也就是先关闭BufferedInputStream
,然后关闭FileInputStream
。
自定义 AutoClosable 实现
try-with-resources
结构不仅适用于 java 内置类,你也可以在自己的类中实现java.lang.AutoCloseable
接口,便可使用try-with-resources
接口。
AutoClosable
接口中只有一个名为close()
的方法,接口如下所示:
public interface AutoClosable {
public void close() throws Exception;
}
任何实现此接口的类都可以与try-with-resources
一起使用。下面是一个简单的示例:
public class MyAutoClosable implements AutoCloseable {
public void doIt() {
System.out.println("MyAutoClosable doing it!");
}
@Override
public void close() throws Exception {
System.out.println("MyAutoClosable closed!");
}
}
doIt()
方法不是AutoClosable
接口的一部分,它之所以存在是因为我们想要做的不仅仅是关闭对象。
下面是MyAutoClosable
与try-with-resources
结构一起使用的示例:
private static void myAutoClosable() throws Exception {
try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
myAutoClosable.doIt();
}
}
当我们调用myAutoClosable()
方法时,输出如下:
MyAutoClosable doing it!
MyAutoClosable closed!
正如你所看到的,无论这些资源是你自己所创建还是 Java 的内置组件,try-with-resources
都是确保正确关闭try-catch
块内部使用的资源的一种强大的方式。
原文链接:http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html#using-multiple-resources
Java Try-with-resources的更多相关文章
- Java项目访问resources文件
最近在对接支付宝支付的开发,需要取到支付的RSA公钥和私钥.于是把公钥和私钥加到resources文件夹里.但是不知道怎么读到这两个文件,也就是不知道路径怎么写.于是网上搜索了下如何获取工作路径,Sy ...
- Java工程读取resources中资源文件路径问题
正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径.在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例. 本地读取资 ...
- 普通java工程的resources目录寻址
问题: 普通java工程的src/main/resources目录下的配置文件如何寻址 在src/main/java目录下的代码中如何访问src/main/resources目录下的配置文件? Mav ...
- Java 如何读取resources
Sample in Github 1.一般使用Maven创建Java工程,代码文件在src/main/java文件夹中,资源文件在src/main/resources文件夹中,Java代码为什么可以读 ...
- Java项目读取resources资源文件路径那点事
今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑.正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径, ...
- Java – Try with Resources
1.介绍 Java 7中引入的对try-with-resources的支持使我们能够声明将在try块中使用的资源,并确保在执行该块后将关闭资源. ⚠️:声明的资源必须实现AutoCloseable接口 ...
- java web中resources路径
UserBean.class.getClassLoader().getResource(filePath).getPath() 或者 Thread.currentThread().getContext ...
- [Java] 在 jar 文件中读取 resources 目录下的文件
注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...
- Java获取/resources目录下的资源文件方法
Web项目开发中,经常会有一些静态资源,被放置在resources目录下,随项目打包在一起,代码中要使用的时候,通过文件读取的方式,加载并使用: 今天总结整理了九种方式获取resources目录下文件 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- Luogu P2055 [ZJOI2009]假期的宿舍
一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...
- 蒙特卡罗方法 python 实现2
如果不考虑作图,这里的两个例子可以改写成下面的样子: 求圆周率 import random ''' 蒙特卡罗模拟 投点法计算圆周率 ''' # 投点游戏 def play_game(): # 圆 r ...
- python 优雅地实现插件架构
近日,决定用 python 实现插件架构,于是上 stackoverflow 逛了一下,在这里发现一段代码,非常喜欢. 提醒各位大侠注意,我对这段代码作了一点小小的改动:原 PLUGINS 是 lis ...
- TMS320VC5509使用nof flash AM29LV400
1. 硬件接口如下,其中nor flash的使用方法,写的时候和NAND FLASH是一样的,读的时候和DRAM是一样的 2. 看下擦除指令和编程指令 3. 代码如下 #include <csl ...
- [arc102E]Stop. Otherwise...[容斥+二项式定理]
题意 给你 \(n\) 个完全相同骰子,每个骰子有 \(k\) 个面,分别标有 \(1\) 到 \(k\) 的所有整数.对于\([2,2k]\) 中的每一个数 \(x\) 求出有多少种方案满足任意两个 ...
- 初级字典树查找在 Emoji、关键字检索上的运用 Part-3
系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 生产实践 我们最终要解决 Emoji 在浏览器和打印物上的显示一致. 进行了多番对比,,在显示效果和精度上,m ...
- 一种C#泛型方法在lua中表示的设计
在进行lua方法注册的时候, 大多数解决方案直接否定了泛型方法, 因为在lua侧难以表达出泛型, 以及lua的函数重载问题, 函数重载问题可以通过一些特殊方法解决, 而泛型问题是主要问题, 以Unit ...
- idou老师教你学istio :基于角色的访问控制
istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...
- QUIC和TCP
作者:henrystark henrystark@126.com Blog: http://henrystark.blog.chinaunix.net/ 日期:20140626 本文遵循CC协议:署名 ...
- PAT-1010 Radix
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 1 ...