Яка мета flush () у потоках Java?


121

У Java flush()метод використовується в потоках. Але я не розумію, у чому вся мета використання цього методу?

fin.flush();

скажи мені кілька пропозицій.

Відповіді:


101

З документів цього flushметоду:

Промиває вихідний потік і змушує списати будь-які буферизовані вихідні байти. Загальний договір флеш-сигналу полягає в тому, що виклик є вказівкою на те, що якщо будь-які попередньо записані байти були буферизовані реалізацією вихідного потоку, такі байти повинні бути негайно записані до призначення.

Буферизація в основному проводиться для поліпшення продуктивності вводу / виводу. Більше про це можна прочитати з цієї статті: Налаштування продуктивності введення-виведення Java .


1
Свіже посилання на Налаштування продуктивності Java I / O Performance oracle.com/technetwork/articles/javase/perftuning-137844.html
Олександр

+1 Дякую Я не міг зрозуміти, чому мій байт не надсилається, і це тому, що мені довелося промивати буфери.
rayryeng

3
Чи застосовується метод промивання лише для буферних потоків? Чи є якась перевага використання його також з іншими потоками (наприклад, вихідними потоками)?
тенішада

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

27

Коли ми даємо будь-яку команду, потоки цієї команди зберігаються в пам'яті, що називається буфер (тимчасове місце пам'яті) на нашому комп’ютері. Коли все тимчасове місце пам’яті заповнене, ми використовуємо flush (), який промиває всі потоки даних і виконує їх повністю і дає новий простір для нових потоків у тимчасовому розташуванні буфера. -Надіюсь, ти зрозумієш


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

@EJP Будь-які посилання на резервну копію ваших заяв? Було б корисно для нас, новачків :)
mr5,

1
@ mr5 Саме плакат повинен створити резервні копії своїх заяв, а не я, але все, що я сказав, чітко сказано в Javadoc
Маркіз Лорн

flush()Явний виклик не потрібно BufferedWriter, якщо ви, close()письменник. close()виконує флеш сам.
Йоссаріан42

Зверніть увагу на close()дзвінки flush(), тому виклик обох є зайвим при використанні FileWriterбез буфера.
Йоссаріан42

26

Коли ви записуєте дані в потік, вони записуються не відразу, а буферуються. Тому використовуйте, flush()коли вам потрібно бути впевненим, що всі ваші дані з буфера записані.

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

Але якщо у вас є вимога зберегти всі записи будь-коли перед тим, як закрити потік, використовуйте flush().


8
Виклик флеш безпосередньо перед закриттям є зайвим, правда? це те саме, що просто дзвонити близьким.
Джон Генкель

2
@BimanTripathy Можу сказати, що зі 100% впевненістю. Це гарантується Javadoc FilterOutputStreamі FilterWriter.
Маркіз Лорнський

7

Якщо буфер заповнений, всі рядки, які буферизовані на ньому, вони будуть збережені на диску. Буфери використовуються для уникнення великих пропозицій! і накладні.

У класі BufferedWriter, розміщеному в java libs, є один рядок типу:

private static int defaultCharBufferSize = 8192;

Якщо ви хочете надсилати дані до заповнення буфера, у вас є контроль. Просто змийте його. Дзвінки письменнику.flush () кажуть: "Надішліть все, що є в буфері, зараз!

довідник: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

сторінки: 453


4

До потоків часто доступні потоки, які періодично спорожнюють їх вміст і, наприклад, виводять його на екран, надсилають у сокет або записують у файл. Це робиться з міркувань продуктивності. Промивання вихідного потоку означає, що ви хочете зупинитися, дочекайтеся повного перенесення вмісту потоку до місця призначення, а потім відновіть виконання з пустим потоком та відправленим контентом.


5
Це фантазія. До потоків не звертаються жодні магічні нитки; лише ті, створені додатком.
Маркіз Лорн

3

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


Це не правда. FileOutputStream.flush () - порожній не-оп.
vertuso
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.