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

标签 java serialization inputstream

我正在查看 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/

相关文章:

java - Hibernate Envers Criteria API 自动添加 'order by' 子句

java - .p2 文件夹的恢复。 Eclipse 没有启动

c++ - QDataStream 不适用于自定义制作的字符数组

c# - Json.NET - 防止重新序列化已经序列化的属性

java - 从网络(Twitter)读取 JSON 数据

java - 如何在没有硬编码路径的情况下从 64 位 java 进程启动 32 位 java 进程

java HTTPConnection 连接到 ip

java - 如何使用 CORDA 将类型列入白名单以进行序列化

java - 比 Scanner 或 BufferedReader 从 STDIN 读取多行数据更快的方法?

java - 输入流根据内容由不同的对象处理