В соответствии с документами java, вызывая close() на любом потоке java.io, автоматически вызывает flush(). Но я видел много примеров, даже в производственных кодексах разработчики явно использовали flush() непосредственно перед close(). В каких условиях нам нужно использовать flush() непосредственно перед close()?
Использование flush() перед закрытием()
Ответ 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() немедленно записывает на диск данные с буферизацией (или почти сразу), поэтому иногда вы хотите убедиться, что ваши записи хранятся до закрытия.