如何正确关闭ObjectInputStream?

时间:2017-11-20 16:54:25

标签: java objectinputstream

我第一次使用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永远不会关闭,因为只要抛出catch,编译器就会跳转到EOFException块。

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

3 个答案:

答案 0 :(得分:5)

您可以使用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了解有关此方法的更多信息。

答案 1 :(得分:1)

使用try with resources statement

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

这样,您的输入流在任何情况下都会关闭。无论例外如何

答案 2 :(得分:1)

感谢范围界定的工作方式,您希望这样做,您尝试将新的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());
}

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