Java try with resources
在本教程中,我们将看到Java try with resources语句。
java的try with resources是 Java 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.

