gpt4 book ai didi

java - 我是否需要为所有编写者/读者保留变量以手动关闭它们?

转载 作者:行者123 更新时间:2023-12-02 01:24:33 25 4
gpt4 key购买 nike

考虑这个例子:

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 的使用。

以上两种实现有什么区别吗?

最佳答案

对于 BufferedWriter,具体来说,您只需在 BufferedWriter 上使用 close,它就会调用 close底层的FileWriter

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

您可以在 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)。

关于java - 我是否需要为所有编写者/读者保留变量以手动关闭它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com