面试题答案
一键面试在Java中,可以通过以下几种方式确保外部资源(如文件句柄、数据库连接)能及时且正确地释放,避免资源泄漏:
1. 使用try - finally
块
在try
块中获取资源并使用,在finally
块中释放资源。这能保证无论try
块中是否抛出异常,资源都能被释放。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ResourceManagementTryFinally {
public static void main(String[] args) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream("example.txt");
// 处理文件内容
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2. 使用try - with - resources
语句(Java 7及以上)
try - with - resources
语句会自动关闭实现了AutoCloseable
接口的资源。它更加简洁,并且能更好地处理异常。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ResourceManagementTryWithResources {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("example.txt")) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
对于数据库连接,使用try - with - resources
也类似:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class DatabaseResourceManagement {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users")) {
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. 自定义资源管理类实现AutoCloseable
接口
如果有自定义的资源,也可以实现AutoCloseable
接口,以便在try - with - resources
中使用。
class CustomResource implements AutoCloseable {
public CustomResource() {
System.out.println("Custom resource created.");
}
public void performAction() {
System.out.println("Performing action with custom resource.");
}
@Override
public void close() throws Exception {
System.out.println("Custom resource closed.");
}
}
public class CustomResourceManagement {
public static void main(String[] args) {
try (CustomResource customResource = new CustomResource()) {
customResource.performAction();
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过以上方法,可以有效地管理外部资源,确保它们在使用完毕后被正确释放,避免资源泄漏。