Чередование BufferedWriter и PrintWriter - PullRequest
0 голосов
/ 05 сентября 2018

Безопасно ли чередовать BufferedWriter и PrintWriter в Java? Рассмотрим следующий пример:

private void writeToFile(File file, String text, Throwable throwable) throws Exception { // I use the "throws Exception" here for simplicity of the example
    // Write text
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
    bufferedWriter.write(text);
    bufferedWriter.newLine();
    bufferedWriter.flush();

    // Write StackTrace
    PrintWriter printWriter = new PrintWriter(bufferedWriter);
    throwable.printStackTrace(printWriter);
    printWriter.close();
}

Я знаю, что мог бы также использовать PrintWriter для написания текста. Но мои вопросы:

  • Безопасно ли использовать PrintWriter и BufferedWriter таким образом?
  • Если это безопасно, будет ли это безопасно без bufferedWriter.flush()?
  • Если это безопасно, будет ли безопасно снова использовать BufferedWriter после того, как я использовал PrintWriter?

Обратите внимание, что аналогичный вопрос здесь предполагает, что доступен только PrintWriter, и поэтому не отвечает на мой вопрос.

1 Ответ

0 голосов
/ 05 сентября 2018

Безопасно ли использовать PrintWriter и BufferedWriter таким образом?

Как вы можете видеть в документации :

Как правило, Writer немедленно отправляет свои выходные данные символьный или байтовый поток. Если не требуется быстрый вывод, это желательно обернуть BufferedWriter вокруг любого Writer, чья write () операции могут быть дорогостоящими, например, FileWriters и OutputStreamWriters.

Например:

 PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

Если это безопасно, будет ли это безопасно без bufferedWriter.flush ()?

Да, это безопасно. Flush () очищает поток в тот момент, когда вы его называете . ИМХО, как правило, без автоматической промывки (и записи большего количества в поток) вы должны вызвать его, прежде чем закрыть поток.

Опять же из документации:

public PrintWriter (OutputStream out)

Создает новый PrintWriter, без автоматической очистки строки из существующего OutputStream. это удобный конструктор создает необходимые промежуточные OutputStreamWriter, который преобразует символы в байты, используя кодировка символов по умолчанию.

Итак, если вы используете этот конструктор, вы должны вызвать flush () перед закрытием потока, если вы используете другой общедоступный PrintWriter (Writer out, boolean autoFlush) и определите true для autoflush, я думаю, что вызов не нужен.

Если это безопасно, было бы также безопасно снова использовать BufferedWriter после того, как я использовал PrintWriter?

Было бы безопасно, если бы вы определили FileWriter для добавления. Теперь вы будете перезаписывать ваш файл при каждом вызове вашей функции. Поэтому я бы использовал этот конструктор: FileWriter (File file, boolean append) и указал бы true для append.

Что не так безопасно: вы должны использовать оператор try-with-resources с autoflush или try-catch-finally и закрыть (и, возможно, очистить) ваш поток там, чтобы правильно освободить ваши ресурсы.

...