Какова цель flush () в потоках Java?


121

В Java flush()метод используется в потоках. Но я не понимаю, для чего вообще нужен этот метод?

fin.flush();

подскажите несколько предложений.

Ответы:


101

Из документации о flushметоде:

Очищает выходной поток и заставляет записывать все буферизованные выходные байты. Общий контракт сброса заключается в том, что его вызов указывает на то, что, если какие-либо ранее записанные байты были буферизованы реализацией выходного потока, такие байты должны быть немедленно записаны в их предполагаемое место назначения.

Буферизация в основном выполняется для повышения производительности ввода-вывода. Подробнее об этом можно прочитать в этой статье: Настройка производительности ввода-вывода Java .


1
Свежая ссылка на настройку производительности ввода-вывода Java oracle.com/technetwork/articles/javase/perftuning-137844.html
Александр

+1 Спасибо. Я не мог понять, почему мои байты не были отправлены, и это потому, что мне пришлось очистить свои буферы.
Rayryeng 02

3
Используется ли метод сброса только с буферизованными потоками? есть ли какие-либо преимущества от использования его с другими потоками (например, с выходным потоком)?
tnishada

Может быть, слова «промывка» не должно быть в его определении. Рекурсивные определения - плохая идея для понимания новых вещей. Я знаю, что вы не писали определение.
Джонатан Комар

27

Когда мы даем любую команду, потоки этой команды сохраняются в области памяти, называемой буфером (временная область памяти) на нашем компьютере. Когда вся временная область памяти заполнена, мы используем flush (), которая очищает все потоки данных и полностью их выполняет, а также дает новое пространство для новых потоков во временном расположении буфера. -Надеюсь, ты поймешь


1
Только в случае BufferedOutputStream, BufferedWriter, ObjectOutputStream,и PrintXXXклассы. flush()Метод любого другого потока или Writerничего не делает.
Маркиз Лорн

@EJP Есть ссылки на резервную копию ваших заявлений? Это было бы полезно для нас, новичков :)
mr5

1
@ mr5 Это плакат, который должен подтвердить свои заявления, а не я, но все, что я сказал, четко изложено в Javadoc
Marquis of Lorne

flush()Явный вызов a не требуется BufferedWriter, если вы являетесь close()писателем. close()сам выполняет сброс.
Yossarian42

Обратите внимание на close()вызовы flush(), поэтому оба вызова избыточны при использовании FileWriterбез буфера.
Yossarian42

26

Когда вы записываете данные в поток, они записываются не сразу, а буферизируются. Поэтому используйте, flush()когда вам нужно быть уверенным, что все ваши данные из буфера записаны.

Мы должны быть уверены, что все записи завершены, прежде чем мы закроем поток, и поэтому flush()вызывается в файловой / буферизованной записиclose() .

Но если у вас есть требование, чтобы все ваши записи сохранялись в любое время перед закрытием потока, используйте flush().


8
Вызов флеша непосредственно перед закрытием избыточен, верно? это то же самое, что просто позвонить близко.
Джон Хенкель

2
@BimanTripathy Я могу сказать это со 100% уверенностью. Это гарантируется Javadoc от FilterOutputStreamи FilterWriter.
Маркиз Лорн

7

Если буфер заполнен, все строки, которые буферизированы в нем, будут сохранены на диск. Буферы используются, чтобы избежать больших сделок! и накладные расходы.

В классе BufferedWriter, который помещается в java libs, есть одна строка вроде:

private static int defaultCharBufferSize = 8192;

Если вы хотите отправить данные до того, как буфер заполнится, у вас есть контроль. Просто промойте это. Вызовы writer.flush () говорят: «Отправьте все, что есть в буфере, сейчас же!

справочник: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

страницы: 453


4

К потокам часто обращаются потоки, которые периодически очищают свое содержимое и, например, отображают его на экране, отправляют в сокет или записывают в файл. Это сделано из соображений производительности. Очистка выходного потока означает, что вы хотите остановиться, дождаться, пока содержимое потока будет полностью передано по назначению, а затем возобновить выполнение с пустым потоком и отправленным содержимым.


5
Это фантастика. К потокам не обращаются никакие волшебные потоки; только те, которые созданы приложением.
Marquis of Lorne

3

Что касается производительности, сначала данные должны быть записаны в буфер. Когда буфер заполняется, данные записываются в вывод (файл, консоль и т. Д.). Когда буфер частично заполнен и вы хотите отправить его на вывод (файл, консоль), вам необходимо вызвать метод flush () вручную, чтобы записать частично заполненный буфер на вывод (файл, консоль).


Это неправда. FileOutputStream.flush () - это пустой запрет.
Vertuso
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.