簡體   English   中英

我需要保留所有作者/讀者的變量以手動將其全部關閉嗎?

[英]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();
    }
}

同樣適用於FileReaderBufferedReader的用法。

上面兩個實現之間有什么區別嗎?

特別是使用BufferedWriter時,您可以僅在BufferedWriter上使用close ,它將在基礎FileWriter上調用close

但是 ,據我所知,這沒有記錄,也不需要包裝其他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;
        }
    }
}

注意使用的嘗試-以資源為自動關閉out (通過w )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM