Лучшие практики Java - нужно постоянно писать в файл - BufferedWriter?

Итак, у меня есть процесс Java, который должен постоянно добавлять новую строку в файл каждые 100 миллисекунд. В настоящее время я использую для этого BufferedWriter, но из того, что я прочитал, объект BufferedWriter всегда должен быть .close() после его завершения.

Если бы я сделал это, мне пришлось бы создавать новый объект BufferedWriter каждые несколько миллисекунд, что не идеально. Есть ли проблемы с созданием одного статического BufferedWriter и просто .flush() после каждой записи?

Наконец, является ли BufferedWriter лучшим классом для этого, если важна производительность? Есть ли жизнеспособные альтернативы?

Спасибо!


person mathmonkey    schedule 09.03.2014    source источник
comment
Через 100 millisecond интервалов, с каким допуском?   -  person Elliott Frisch    schedule 09.03.2014


Ответы (2)


BufferedWriter должен быть закрыт, когда он закончен. Если вы делаете что-то вроде ведения журнала, вполне приемлемо держать открытый модуль записи в объекте, отвечающем за ведение журнала, а затем закрывать его в конце выполнения (или всякий раз, когда вы переходите к новому файлу журнала).

Чего вам не следует делать, так это просто открывать средство записи, а затем удалять ссылку, не закрывая ее; это может привести к утечке ресурсов и, в случае чего-то с буферизацией, может привести к потере последней части вывода.

person chrylis -cautiouslyoptimistic-    schedule 09.03.2014
comment
+1 используйте flush(), чтобы записать буфер, который сразу появится, используйте close() только тогда, когда вам больше не нужно записывать в файл. - person Peter Lawrey; 09.03.2014

Есть ли проблемы с созданием одного статического BufferedWriter и просто .flush() после каждой записи?

Нет ничего плохого в одном долгоживущем BufferedWriter. На самом деле это хорошая идея. (Используете ли вы static или что-то еще, это другой вопрос... но это дизайнерское решение не влияет на функциональность и производительность.)

Вызов сброса после каждой записи более сомнительный с точки зрения производительности. Это заставит ваше приложение делать много write системных вызовов... что дорого. Я бы сделал это только в том случае, если вам нужно вести журнал немедленно. В качестве альтернативы можно сбросить по таймеру ... или вообще не сбрасывать, и полагаться на (окончательное) закрытие BufferedWriter для сброса любых ожидающих данных.

Но в любом случае, долгоживущий BufferedWriter, который вы сбрасываете, вероятно, будет лучше, чем создание, запись и закрытие множества объектов BufferedWriter.

person Stephen C    schedule 09.03.2014