Здесь так много опасных ответов и комментариев. Продолжайте читать, почему я использовал слово опасный .
Перво-наперво. Проверьте это.
Вы обнаружите, что нет единственного утверждения, что поговорка close()
вызовет flush()
. Исправь меня, если я что-то пропустил.
Используйте flush()
всякий раз, когда вам нужно или нужно гарантировать, что буферизованные данные сброшены хотя бы до уровня ОС.
flush()
имеет свои цели.
// client
// sends exactly 234 bytes
// and returns exactly 124 bytes from the server
static byte[] sendAndReceive(final OutputStream output,
final InputStream input)
throws IOException {
final byte[] request = new byte[234];
output.write(request);
// output.flush(); // @@? is this required or not?
final byte[] response = new byte[124];
new DataInputStream(input).readFully(response);
return response;
}
// server
// recieve exactly 234 bytes from the client
// sends exactly 124 bytes
static void receiveAndSend(final InputStream input,
final OutputStream output)
throws IOException {
final byte[] request = new byte[234];
new DataInputStream(input).readFully(request);
final byte[] response = new byte[124];
output.write(response);
// output.flush(); // @@? is this required or not?
}
Все могло измениться, но я испытал это на себе около десяти лет назад. Вышеупомянутый исходный код (клиент) работал с Windows XP и не работал с Windows 2000 Server для той же конечной точки (сервера).
И (вы) не должны (не должны) полагаться на поведение, специфичное для реализации close()
.
static void writeFile(File file, byte[] bytes) throws IOException {
try (OutputStream out = new FileOutputStream(bytes)) {
out.write(bytes);
out.flush(); // who cares what FileInputStream#close does?
}
}
Также обратите внимание, что flush()
не означает запись / отправку ваших данных на физический диск или удаленную конечную точку. В основном он просто сбрасывает буферизованные данные в JVM в базовую ОС.
опечаток
Writer#close()
прямо говорит, что это
закрывает поток, сначала сбрасывая его.
Но это не значит, что все подклассы сохраняют этот корневой контракт. См. PrintWriter#close()
, который (без flush()
) закрывает внутренний out
(Writer
), который, опять же, зависит от реализации out
close()
.