【问题标题】:Do I need to keep variables for all writers/readers to close them all manually?我是否需要为所有作者/读者保留变量以手动关闭它们?
【发布时间】:2019-11-30 04:52:36
【问题描述】:

考虑这个例子:

public class FileAppender implements AutoCloseable {
    private final FileWriter fileWriter;
    private final BufferedWriter bufferedWriter;

    public FileAppender(String fileName) throws IOException {
        fileWriter = new FileWriter(fileName, true)
        bufferedWriter = new BufferedWriter(fileWriter);
    }

    public void appendLine(String line) throws IOException {
        bufferedWriter.write(line + "\n");
    }

    @Override
    public void close() throws Exception {
        bufferedWriter.close();
        fileWriter.close();
    }
}

这里我们保留一个未使用的FileWriter 作为类的成员,以便我们以后可以手动关闭它。网络上有很多教程展示了这样的示例,其中手动关闭了多个流。

我们可以更简洁地实现同一个类:

public class FileAppender implements AutoCloseable {
    private final BufferedWriter writer;

    public FileAppender(String fileName) throws IOException {
        writer = new BufferedWriter(new FileWriter(fileName, true));
    }

    public void appendLine(String line) throws IOException {
        writer.write(line + "\n");
    }

    @Override
    public void close() throws Exception {
        writer.close();
    }
}

同样适用于FileReaderBufferedReader

以上两种实现会有什么不同吗?

【问题讨论】:

标签: java file-io filereader filewriter


【解决方案1】:

对于BufferedWriter,具体来说,您可以在BufferedWriter 上使用close,它会在底层FileWriter 上调用close

但是,据我所知,这没有记录在案,也不需要包装其他 Writers(以及类似的流)的 Writer 实现。我很偏执,并且倾向于明确地关闭事物(以打开它们的相反顺序)。

您可以在BufferedWriter 源代码中看到关闭操作(此示例来自 JDK 11.0.1),但您必须非常仔细地查看:

public void close() throws IOException {
    synchronized (lock) {
        if (out == null) {
            return;
        }
        try (Writer w = out) {
            flushBuffer();
        } finally {
            out = null;
            cb = null;
        }
    }
}

注意使用 try-with-resources 自动关闭 out(通过 w)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多