关闭 Java Input/Output 流

Closing Java Input/Output streams

这是我的代码:

FileOutputStream fos = null;
DataOutputStream dos = null;
try {
    fos = new FileOutputStream(file);
    dos = new DataOutputStream(fos);

    .... writing to file ....

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (dos != null) {
        try {
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if (fos != null) {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我读到你只需要关闭 DataOutpustStream 它将关闭所有其他流,这是正确的吗?如果我关闭 FileOutputStream 有什么坏处吗?关闭流的最佳方法是什么?

关闭流的最佳方式是在您使用 try-resource-blocks 时。 在大多数情况下,流以级联方式关闭。要获得答案,您必须仔细查看 API.

不,它没有任何危害

您需要按照打开它们的相同顺序关闭它们 - 将它们视为彼此的包装器。如果您创建一个 FileOutputStream 然后将其包装在 DataOutputStream 中,您应该先关闭 DataOutputStream

但你应该使用 try-with-resources:

try (
        final FileOutputStream fos = new FileOutputStream(file);
        final DataOutputStream dos = new DataOutputStream(fos);
) {
    ....writing to file....

} catch (IOException e) {
    e.printStackTrace();
}

而如果你用同样的方式处理这两个异常,你只能捕捉到更一般的IOException