[英]Do I need to keep variables for all writers/readers to close them all manually?
考慮以下示例:
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();
}
}
同樣適用於FileReader
和BufferedReader
的用法。
上面兩個實現之間有什么區別嗎?
特別是使用BufferedWriter
時,您可以僅在BufferedWriter
上使用close
,它將在基礎FileWriter
上調用close
。
但是 ,據我所知,這沒有記錄,也不需要包裝其他Writer
的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;
}
}
}
注意使用的嘗試-以資源為自動關閉out
(通過w
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.