资源试用

原文:https://www.studytonight.com/java-9/try-with-resources

Java 资源试用首次添加到 Java 7 版本中的一个特性。它有助于在完成任务后自动关闭资源,如 Java 输入流或 JDBC 连接。

任何实现java.lang.AutoCloseable 接口的对象或资源都可以作为资源使用。例如,FileOutputStream类实现了AutoCloseable接口,因此可以在 try-with-resources 语句中使用。

如果我们不使用试用资源,那么我们需要使用 close() 方法手动关闭连接。如果我们忘记关闭连接,那么可能会导致易受攻击的资源泄漏问题。

让我们通过一些例子来看看试用资源的使用。

示例:旧方法

这是一个简单的例子,在早期版本的 Java 中用来安全地打开 try 块中的资源。注意,我们使用 close() 方法关闭 fileStream 实例。

import java.io.FileOutputStream;
import java.io.IOException;

public class Main { 
    public static void main(String[] args) throws IOException{  
        FileOutputStream fileStream = new FileOutputStream("abc.txt");
        try{  
            String greeting = "Hello from Studytonigh.";      
               byte b[] = greeting.getBytes();       
               fileStream.write(b);      
               System.out.println("File written");           
       }catch(IOException e) {  
           System.out.println(e);  
       }
        finally {
            // closing stream
            fileStream.close();
        }
    }
}

文件已写入

示例:Java 7

这就是我们可以用 Java 7 做的。在这里,我们传递了一个 fileStream 实例来尝试使用资源。这是一种新的 try 块语法,被称为资源试。注意,我们没有关闭这里的 fileStream 实例,因为现在它将自动关闭

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Main {
    public static void main(String[] args) throws FileNotFoundException{  
        try(FileOutputStream fileStream = new FileOutputStream("abc.txt");){  
            String greeting = "Hello from Studytonight.";      
               byte b[] = greeting.getBytes();       
               fileStream.write(b);      
               System.out.println("File written");           
       }catch(Exception e) {  
           System.out.println(e);  
       }         
    }
}

文件已写入

Java 9:试用资源语句改进

示例:Java 9

在 Java 9 中,try-with-resources 语句得到了改进,这样我们就可以在 try 之外声明资源(对象),然后将其传递到 try 语句中。参见下面的例子,这里我们在 try 之外创建了 FileOutputStream 对象,并在稍后将其引用传递给 try-语句。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Main {
    public static void main(String[] args) throws FileNotFoundException{
        FileOutputStream fileStream = new FileOutputStream("abc.txt");  
        try(fileStream){  
            String greeting = "Hello from Studytonight.";      
               byte b[] = greeting.getBytes();       
               fileStream.write(b);      
               System.out.println("File written");           
       }catch(Exception e) {  
           System.out.println(e);  
       }         
    }
}

文件已写入

Java 9 JDBC 示例

资源可以是实现AutoCloseable接口的任何有效对象。在这里,Connection接口扩展了AutoCloseable接口,这样我们就可以将其传递到资源试用语句中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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

示例:多个资源

Java 允许我们传递多个资源。因此,如果我们有多个资源,那么 try 语句将处理所有资源,并在执行任务后关闭。

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Main { 
    public static void main(String[] args) throws FileNotFoundException{ 
        FileInputStream fileStream = new FileInputStream("abc.txt");
        BufferedInputStream bufferedInput = new BufferedInputStream(fileStream);
        try( fileStream; 
                bufferedInput;
                )
        {  
            int data = bufferedInput.read();
            while(data != -1){
                System.out.print((char) data);
                data = bufferedInput.read();
            }        
        }catch(Exception e) {  
            System.out.println(e);  
        }         
    }
}