资源试用
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);
}
}
}