Безопасно ли использовать 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 и закрыть (и, возможно, очистить) ваш поток там, чтобы правильно освободить ваши ресурсы.