如何正确关闭 ObjectInputStream?

How to close ObjectInputStream properly?

我是第一次使用 FileInputStream 并尝试从文件加载对象 (Item)。

这是我的代码:

    try {

        FileInputStream fi = new FileInputStream(f);
        ObjectInputStream reader = new ObjectInputStream(fi);

        while (true) {
            Item i = (Item)reader.readObject();
            System.out.println(i.getName());
        }

    } catch (Exception e) {
        System.out.println(e.toString());
    }

我读到这是执行此操作的标准方法,代码工作正常。但是,这种方式 fireader 永远不会关闭,因为一旦 EOFException 被抛出,编译器就会跳转到 catch 块。

编译器不允许我关闭 catchfinally 块中的 fireader。这真的应该是这样吗?如何正确关闭输入对象?

使用try with resources statement:

try(FileInputStream fi = new FileInputStream(f)){
    try(ObjectInputStream oi = new ObjectInputStream(fi)){
         // your code
     }
}

这样你的输入流在任何情况下都是关闭的。无一例外

您可以使用 try-with-resources 语句,它看起来像这样:

try (FileInputStream fi = new FileInputStream(f); 
    ObjectInputStream reader = new ObjectInputStream(fi)) {        

    while (true) {
        Item i = (Item)reader.readObject();
        System.out.println(i.getName());
    }

} catch (Exception e) {
    System.out.println(e.toString());
}

点击此处documentation了解有关此方法的更多信息。

由于作用域的工作原理,您想这样做,尝试将新的 try/finally 与每个 Stream:

相关联
try {

    FileInputStream fi = new FileInputStream(f);
    try {
        ObjectInputStream reader = new ObjectInputStream(fi);
        try {
            while (true) {
                Item i = (Item)reader.readObject();
                System.out.println(i.getName());
            }
        } finally {
            reader.close();
        }

    } finally {
        fi.close();
    }

} catch (Exception e) {
    System.out.println(e.toString());
}

但在最近的 java 版本中(使用 try-with-resources)你可以这样做,实际上:

try (FileInputStream fi = new FileInputStream(f),
     ObjectInputStream reader = new ObjectInputStream(fi)) {

    while (true) {
        Item i = (Item)reader.readObject();
        System.out.println(i.getName());
    }

} catch (Exception e) {
    System.out.println(e.toString());
}

并且编译基本上会将其转换为第一个版本。