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.