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

Использование flush() перед закрытием()

В соответствии с документами java, вызывая close() на любом потоке java.io, автоматически вызывает flush(). Но я видел много примеров, даже в производственных кодексах разработчики явно использовали flush() непосредственно перед close(). В каких условиях нам нужно использовать flush() непосредственно перед close()?

4b9b3361

Ответ 1

Разработчик получает привычку вызывать flush() после написания чего-то, что нужно отправить.

IMHO Использование flush(), затем close() является обычным, когда только что была запись, например.

// write a message
out.write(buffer, 0, size);
out.flush();

// finished
out.close();

Как вы видите, flush() избыточен, но означает, что вы следуете шаблону.

Ответ 2

Я думаю, во многих случаях это потому, что они не знают, что close() также вызывает flush(), поэтому они хотят быть в безопасности.

В любом случае использование буферизованного потока должно сделать ручную очистку почти избыточным.

Ответ 3

Я хочу указать на важную концепцию, на которую ссылались многие предыдущие комментарии. Метод потока close() НЕ обязательно вызывает flush().

Например, org.apache.axis.utils.ByteArray #close() не вызывает flush().
(нажмите на ссылку, чтобы увидеть исходный код)

То же самое верно в целом для любых реализаций Flushable и Closeable. Ярким примером является java.io.PrintWriter. Его метод close() НЕ вызывает flush().

Это может объяснить, почему разработчики осторожно вызывают flush() перед закрытием своих потоков.

Ответ 4

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