今天撸代码的时候发现了一段这样的代码
try(
Connection conn=DriverManager.getConnection(url,user,pass);
Statement stmt=conn.createStatement()
) {
boolean hasResultSet=stmt.execute(sql);
}
和平常见的不一样,我们平常见的是这样的
try{
fis=new FileInputStream("src\\com\\ggp\\first\\FileInputStreamDemo.java");
byte[]bbuf=new byte[1024];
int hasRead=0;
while((hasRead=fis.read(bbuf))>0){
System.out.println(new String(bbuf,0,hasRead));
}
}catch(IOException e){
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
如果{}中的代码块出现了异常,会被catch捕获,然后执行catch中的代码,接着执行finally中的码,其中catch中的代码有了异常才会被执行,finally中的代码无论有没有异常都会被执行,
而第一种情况的()中的代码一般放的是对资源的申请,如果{}中的代码出项了异常,()中的资源就会被关闭,这在inputstream和outputstream的使用中会很方便例如
private static void customBufferStreamCopy(File source, File target) {
try (InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target)){
byte[] buf = new byte[8192];
int i;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
从网上查阅资料得知从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理。
The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements java.lang.AutoCloseable, which includes all objects which implement java.io.Closeable, can be used as a resource.
带有resources的try语句声明一个或多个resources。resources是在程序结束后必须关闭的对象。try-with-resources语句确保在语句末尾关闭每个resources。
任何实现java.lang.AutoCloseable,包括实现了java.io.Closeable的类,都可以作为resources使用。
自定义AutoClosable 实现
这个try-with-resources结构里不仅能够操作java内置的类。你也可以在自己的类中实现java.lang.AutoCloseable接口,然后在try-with-resources结构里使用这个类。
AutoClosable 接口仅仅有一个方法,接口定义如下:
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.doIt()被调用时,下面是打印到System.out的输出:
MyAutoClosable doing it!
MyAutoClosable closed!
通过上面这些你可以看到,不论try-catch中使用的资源是自己创造的还是java内置的类型,try-with-resources都是一个能够确保资源能被正确地关闭的强大方法。
参考资料
1、The try-with-resources Statement
转载来自
1、https://blog.csdn.net/qq_33543634/article/details/80725899
2、https://blog.csdn.net/bigtree_3721/article/details/50508985