2015-09-01 5 views
12

Совершите 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

+4

нет. но 'close()' обычно делает промывку в любом случае. – ZhongYu

+1

5 ответов до сих пор * все * цитирование javadoc. Угадайте, что это знак для * чтения документа *. – Andreas

ответ

10

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

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

Закрывает поток, промывке это первый.

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

8

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

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

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

1

Из Javdocs:

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

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

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

3

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

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 выдает Closeable, он вызывается методом close при выходе из блока try {}, и метод закрытия сначала вызовет flush, как уже упоминалось.

Смежные вопросы