Подтвердить что ты не робот

Вызов flush() необходим при использовании try-with-resources

Будет ли try-with-resources вызывать flush() неявно?

Если это так, в следующем фрагменте кода bw.flush() можно безопасно удалить?

static void printToFile1(String text, File file) {
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
        bw.write(text);
        bw.flush();
    } catch (IOException ex) {
        // handle ex
    }
}

пс. Я не вижу описания в официальном документе:

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html

4b9b3361

Ответ 1

Closeable и AutoCloseable - это интерфейсы общего назначения, которые ничего не знают о промывке, Поэтому вы не можете найти никакой информации об этом в своей документации, кроме некоторых слов о выпуске ресурсов.

A Writer, с другой стороны, представляет собой более абстрактный абстрактный класс, который теперь знает что-то о промывке. Некоторая выдержка из документации по методу Writer.close():

Закрывает поток, сначала промывая его.

Итак - да - при использовании записи, close всегда будет flush. Это в основном означает, что вам нужно проконсультироваться с документацией о конкретных классах, которые вы используете, когда пытаетесь выяснить, что делает закрытие.

Ответ 2

Ресурсы автоматически закрываются при использовании try-with-resource. В рамках этого процесса он также автоматически вызывается автоматически.

Как упоминалось в doc для close метода BufferedWriter:

Закрывает поток, сначала промывая его. Как только поток будет закрыт, дополнительные вызовы write() или flush() вызовут исключение IOException выброшены.

Ответ 3

Цитирование javadoc BufferedWriter.close():

Закрывает поток, сначала промывает его.

Ответ 4

Минимальный объем кода, который нужно записать в этом случае:

try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
    bw.write("Test");
} catch (IOException e) {
    // handle exception
}

Следовательно, вам не нужно явно вызывать метод flush, так как он будет вызываться close, как описано в javadoc:

Закрывает поток, сначала промывая его. Как только поток будет закрыт, дополнительные вызовы write() или flush() вызовут исключение IOException выброшены. Закрытие ранее закрытого потока не влияет.

Это поведение унаследовано от класса Writer, следовательно, помимо BufferedWriter такое же поведение обеспечивается также: CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter.

Такое поведение не содержится в документации tryWithResources или AutoCloseable, поскольку поведение специфично для данной реализации Writer. Поскольку Writer extends Closeable, он будет вызывать метод close при выходе из блока try {} и метода close сначала вызовет flush, как уже упоминалось.

Ответ 5

Из Javdocs:

Оператор try-with-resources - это оператор try, который объявляет один или больше ресурсов. Ресурс - это объект, который должен быть закрыт после программа заканчивается им. Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце инструкции. Любые объект, реализующий java.lang.AutoCloseable, который включает все объекты, которые реализуют java.io.Closeable, могут использоваться как ресурс.

В BufferedWriter.close() явно указано, что:

Закрывает поток, сначала промывая его. Как только поток будет закрыт, дополнительные вызовы write() или flush() вызовут исключение IOException. Закрытие ранее закрытого потока не влияет.