Java 的 try-with-resources
语句是一种 try
语句,用于声明一种或多种资源,例如流、套接字、数据库连接等。这些资源必须在程序结束时关闭。try-with-resources
语句会在语句结束时自动关闭资源。
try-with-resources
特性是在 Java 7 中引入的。try-with-resources
可以替代用于资源对象的 try-catch-finally
语句。
try-with-resources
语句也被称为“自动资源管理”,它是在 Java 7 中引入的。如果工作时涉及资源对象,则此语句可替代 try-catch-finally
语句。
try-with-resources
的语法
要使用此语句,您只需要在圆括号内声明所需资源,并且创建的资源将在块结束时自动关闭。以下是 try-with-resources
语句的语法:
try (resources 声明) {
} catch (Exception e) {
}
例如,使用 try-with-resources
打开文件:
try (FileReader fr = new FileReader("文件路径")) {
} catch (...) {
}
下面是使用 try-with-resources
语句读取文件数据的程序。
try-with-resources
示例
在此程序中,我们在 try with resources
语句中创建了 FileReader
对象。FileReader fr
引用在 try
语句中声明,并且不需要记住在 finally
块中关闭它,因为它会由 JVM 自动关闭,从而不会发生内存泄漏或连接丢失的可能性。
import java.io.FileReader;
import java.io.IOException;
public class Try_withDemo {
public static void main(String args[]) {
try (FileReader fr = new FileReader("E://file.txt")) {
char[] a = new char[50];
fr.read(a);
for (char c : a)
System.out.print(c);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try-with-resources
中的多个资源
您也可以在一个 try
块内声明多个资源。请考虑以下示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (
FileReader fileReader = new FileReader("file1.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
FileWriter fileWriter = new FileWriter("file2.txt");
PrintWriter printWriter = new PrintWriter(fileWriter)
) {
String line;
while ((line = bufferedReader.readLine()) != null) {
printWriter.println(line);
}
System.out.println("内容已复制。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例:不使用 try-with-resources
在此程序中,我们使用 FileReader
从文件中读取数据,并在 finally
块中关闭它。在此程序中,我们在 try
块内创建了 FileReader
对象。FileReader fr
引用在 try
块外声明,以便在 try
块外可访问,并且需要记住在 finally
块或程序退出前关闭它,以免发生内存泄漏或连接丢失的可能性。
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class ReadData_Demo {
public static void main(String args[]) {
FileReader fr = null;
try {
File file = new File("file.txt");
fr = new FileReader(file); char[] a = new char[50];
fr.read(a);
for (char c : a)
System.out.print(c);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
try-with-resources
:注意事项
使用 try-with-resources
语句时,请记住以下几点:
-
要使用
try-with-resources
语句,类应该实现 AutoCloseable
接口,并且其 close()
方法会在运行时自动调用。
-
您可以在
try-with-resources
语句中声明多个类。
-
当在
try-with-resources
块中声明多个类时,这些类将以相反的顺序关闭。
-
除了在圆括号内声明资源外,其他一切与普通
try/catch
块相同。
-
在
try
中声明的资源在 try
块开始前实例化。
-
在
try
块中声明的资源隐式地被声明为 final
。
Java 9 中 try-with-resources
的改进
在 Java 9 之前,资源需要在 try
语句前或在 try
语句内声明,如下例所示。在此示例中,我们将使用 BufferedReader
作为资源来读取字符串,然后需要关闭 BufferedReader
。
Java 9 之前的版本
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
public class Tester {
public static void main(String[] args) throws IOException {
System.out.println(readData("test"));
}
static String readData(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (BufferedReader br1 = br) {
return br1.readLine();
}
}
}
输出:
test
在此我们需要在 try
语句内部声明资源 br1
并使用它。在 Java 9 中,不再需要声明 br1
,以下程序将产生相同的结果。
Java 9 及以后的版本
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
public class Tester {
public static void main(String[] args) throws IOException {
System.out.println(readData("test"));
}
static String readData(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) {
return br.readLine();
}
}
}
输出:
test