gpt4 book ai didi

Java序列化: close streams in try or in a finally block?

转载 作者:行者123 更新时间:2023-12-02 09:43:58 24 4
gpt4 key购买 nike

我正在查看 Java 序列化文章,并多次偶然发现流在 try block 中而不是在 finally block 中关闭的示例。有人可以向我解释一下这是为什么吗?

示例:

import java.io.*;
public class DeserializeDemo {

public static void main(String [] args) {
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch(IOException i) {
i.printStackTrace();
return;
} catch(ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}

System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}

来源:http://www.tutorialspoint.com/java/java_serialization.htm

最佳答案

try-with-resources 语句

try-with-resources 语句是声明一个或多个资源的 try 语句。资源是一个对象,在程序使用完毕后必须将其关闭。 try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象(包括所有实现 java.io.Closeable 的对象)都可以用作资源。

以下示例从文件中读取第一行。它使用 BufferedReader 的实例从文件中读取数据。 BufferedReader 是一种资源,程序使用完毕后必须将其关闭:

static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}

在此示例中,try-with-resources 语句中声明的资源是 BufferedReader。声明语句出现在紧跟在 try 关键字后面的括号内。 Java SE 7 及更高版本中的 BufferedReader 类实现了 java.lang.AutoCloseable 接口(interface)。由于 BufferedReader 实例是在 try-with-resource 语句中声明的,因此无论 try 语句正常完成还是突然完成(由于 BufferedReader.readLine 方法抛出 IOException),该实例都会被关闭。

在 Java SE 7 之前,您可以使用 finally block 来确保关闭资源,无论 try 语句是正常完成还是突然完成。以下示例使用finally block 而不是try-with-resources 语句:

static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}

来源 => http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

关于Java序列化: close streams in try or in a finally block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39572502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com