Java try with resources

时间:2020-02-23 14:35:16  来源:igfitidea点击:

在本教程中,我们将看到Java try with resources语句。
java的try with resourcesJava 7加入的Java的一个特征。
它有助于关闭内部声明的所有资源 try block
它在使用后自动关闭资源。
资源可以是任何文件或者数据库连接。
例如,如果我们使用文件递交,那么打开文件后,它需要在读取或者写入数据后关闭。
在早期的Java版本中,我们必须明确地关闭资源,但是来自

Java 7,我们不需要担心关闭资源。

可以自动处理哪种类型的资源?

java说,任何实现的对象 java.lang.AutoCloseable接口和 java.io.Closeable接口,可以用作资源。

让我们从例子开始理解主题。

关闭资源的较旧的方法

这是一种较旧的方法,我们用于处理文件相关的操作。
注意,我们手动关闭资源 close()方法。

import java.io.FileOutputStream;
 
public class Main{
    public static void main(String[] args){
        try {
            FileOutputStream fileOutputStream =new FileOutputStream("info.txt");
            fileOutputStream.write("theitroad is a technical blog".getBytes());
            System.out.println("File is written");
            fileOutputStream.close(); //closing resource
        }catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出:

File is written

Java 7 try with resources

使用Java 7引入了 try with resources ,并有助于减少手动关闭资源的努力。
现在,我们不需要使用 close()方法。
看到这个例子。

import java.io.FileOutputStream;
 
public class Main{
    public static void main(String[] args){
        try (FileOutputStream fileOutputStream = new FileOutputStream("info.txt")){
            fileOutputStream.write("theitroad is a technical blog".getBytes());
            System.out.println("File is written");
            //fileOutputStream.close(); No need to close manually 
        }catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出:

File is written

语法

以下是尝试的语法,其中资源包括括号等函数以收集资源。

try(  
        //resources    
        ){
    //body of try block
 
}catch( //Exception ) {
    //handler code
}

注意:在Java 7版本之前,只有最终块用于确保资源正确关闭。

例子

让我们参加一个Java尝试使用资源的一个例子。
其中我们正在创建数据库连接,而不是关闭连接,因为它将被新的尝试块处理。
注意,我们其中使用多个资源,这意味着它也可以处理多个资源。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class Main{
    public static void main(String[] args){
        try(    Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/employee","user_name","user_password");  
                Statement stmt=con.createStatement();  
                ResultSet rs=stmt.executeQuery("select * from emp");  
                )
        {   
            while(rs.next()){    
                System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getString(3));    
            }  
        }   
        catch(Exception e){    
            System.out.println(e);  
        }    
    }
}

Java 9 try with resources改进

在Java 9中,改进了try with resources,允许在Try块之外声明或者创建资源。
在Java 9之前,它是不可能的,编译器生成错误。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
public class Main{
    public static void main(String[] args) throws FileNotFoundException{
        FileOutputStream fileOutputStream = new FileOutputStream("info.txt"); //Outside the try block
        try (fileOutputStream){
            fileOutputStream.write("theitroad is a technical blog".getBytes());
            System.out.println("File is written");
        }catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出:

File is written

看,我们在尝试外部声明资源外部的资源,编译器成功编译文件,但在Java 7或者Java 8的情况下,我们不能这样做。

带有 try with resources的Finally块

虽然Java尝试使用Resources进行资源清理任务,但如果有任何不实现的资源 AutoCloseable接口需要在最终块中关闭。
在此示例中,我们使用最终块使用资源尝试。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
 
public class Main{
    public static void main(String[] args) throws FileNotFoundException{
        FileOutputStream fileOutputStream = new FileOutputStream("info.txt");
        try (fileOutputStream){
            fileOutputStream.write("theitroad is a technical blog".getBytes());
            System.out.println("File is written"); 
        }catch(Exception e) {
            System.out.println(e);
        }
        finally {
                //resource releasing code
            System.out.println("Finally block is executed");
        }
    }
}

输出:

File is written
Finally block is executed

创建自定义AutoCloseable代码

任何实现的类 AutoCloseable接口可用于 try with resources
让我们创建一个类和实现 AutoCloseable接口。
此类具有一些实用方法。
注意,我们没有调用 close()的方法 SetupConnection类,但它由编译器隐含地调用。
查看示例及其输出。

class SetupConnection implements AutoCloseable{
    void configureConnection() {
        System.out.println("Connection configured.");
    }   
    void connect() {
        System.out.println("Connected");
    }
    @Override
    public void close() throws Exception {
        System.out.println("Connection is closed.");
    }
}
 
public class Main{
    public static void main(String[] args){
        SetupConnection con = new SetupConnection();
        try (con){
            con.configureConnection();
            con.connect();
        }catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出:

Connection configured.
Connected
Connection is closed.