Ответы:
Из документации о flush
методе:
Очищает выходной поток и заставляет записывать все буферизованные выходные байты. Общий контракт сброса заключается в том, что его вызов указывает на то, что, если какие-либо ранее записанные байты были буферизованы реализацией выходного потока, такие байты должны быть немедленно записаны в их предполагаемое место назначения.
Буферизация в основном выполняется для повышения производительности ввода-вывода. Подробнее об этом можно прочитать в этой статье: Настройка производительности ввода-вывода Java .
Когда мы даем любую команду, потоки этой команды сохраняются в области памяти, называемой буфером (временная область памяти) на нашем компьютере. Когда вся временная область памяти заполнена, мы используем flush (), которая очищает все потоки данных и полностью их выполняет, а также дает новое пространство для новых потоков во временном расположении буфера. -Надеюсь, ты поймешь
BufferedOutputStream
, BufferedWriter
, ObjectOutputStream,
и PrintXXX
классы. flush()
Метод любого другого потока или Writer
ничего не делает.
flush()
Явный вызов a не требуется BufferedWriter
, если вы являетесь close()
писателем. close()
сам выполняет сброс.
close()
вызовы flush()
, поэтому оба вызова избыточны при использовании FileWriter
без буфера.
Когда вы записываете данные в поток, они записываются не сразу, а буферизируются. Поэтому используйте, flush()
когда вам нужно быть уверенным, что все ваши данные из буфера записаны.
Мы должны быть уверены, что все записи завершены, прежде чем мы закроем поток, и поэтому flush()
вызывается в файловой / буферизованной записиclose()
.
Но если у вас есть требование, чтобы все ваши записи сохранялись в любое время перед закрытием потока, используйте flush()
.
FilterOutputStream
и FilterWriter
.
Если буфер заполнен, все строки, которые буферизированы в нем, будут сохранены на диск. Буферы используются, чтобы избежать больших сделок! и накладные расходы.
В классе BufferedWriter, который помещается в java libs, есть одна строка вроде:
private static int defaultCharBufferSize = 8192;
Если вы хотите отправить данные до того, как буфер заполнится, у вас есть контроль. Просто промойте это. Вызовы writer.flush () говорят: «Отправьте все, что есть в буфере, сейчас же!
справочник: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208
страницы: 453
К потокам часто обращаются потоки, которые периодически очищают свое содержимое и, например, отображают его на экране, отправляют в сокет или записывают в файл. Это сделано из соображений производительности. Очистка выходного потока означает, что вы хотите остановиться, дождаться, пока содержимое потока будет полностью передано по назначению, а затем возобновить выполнение с пустым потоком и отправленным содержимым.
Что касается производительности, сначала данные должны быть записаны в буфер. Когда буфер заполняется, данные записываются в вывод (файл, консоль и т. Д.). Когда буфер частично заполнен и вы хотите отправить его на вывод (файл, консоль), вам необходимо вызвать метод flush () вручную, чтобы записать частично заполненный буфер на вывод (файл, консоль).