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