Почему необходимо очищать выходной буфер, когда он только что был создан?
В следующем сценарии
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
// Do stuff with it
Почему всегда необходимо очищать буфер после первоначального создания?
Я вижу это все время, и я действительно не понимаю, что нужно смывать. Я ожидаю, что вновь созданные переменные будут пустыми, если не указано иное.
Вроде того, как купить мусорное ведро и найти крошечную кучу мусора внутри, которая пришла с ним.
3 ответа
Это необходимо при использовании любого ObjectInputStream
а также ObjectOutputStream
потому что они отправляют заголовок через поток перед вызовом первой записи. Призыв к flush()
отправит этот заголовок на удаленную сторону.
Согласно спецификации существует заголовок следующего содержания:
magic version
Если заголовок не прибывает в момент сборки ObjectInputStream, этот вызов будет зависать до тех пор, пока не получит байты заголовка.
Это означает, что если рассматриваемый протокол написан с ObjectStream
s, он должен смываться после создания ObjectOutputStream
,
За 15 лет написания Java на профессиональном уровне я никогда не сталкивался с необходимостью очищать поток перед записью в него.
Операция сброса ничего не будет делать, так как промывать нечего.
Вы хотите очистить поток перед его закрытием, хотя операция закрытия должна сделать это для вас, часто рекомендуется делать это явно (и я сталкивался с ситуациями, когда это действительно имело значение, когда, очевидно, операция закрытия на самом деле не выполнялась). сначала сделай флеш.
Может быть, вас это смущает?
Когда вы записываете данные в поток, происходит некоторая буферизация, и вы точно не знаете точно, когда на самом деле будут отправлены последние данные. Вы можете выполнить много операций rite для потока перед его закрытием, и вызов метода flush() гарантирует, что последние данные, которые, как вы думали, вы уже написали, действительно попадут в файл. Когда вы используете файл, либо читаете его, либо записываете в него, вы должны вызывать метод close(). Когда вы выполняете файловый ввод / вывод, вы используете дорогие и ограниченные ресурсы операционной системы, и поэтому, когда вы закончите, вызов close() освободит эти ресурсы.