flush () обработка Java-файлов - PullRequest
5 голосов
/ 28 октября 2010

Какое точное использование flush ()? В чем разница между потоком и буфером? Зачем нам буфер?

Ответы [ 3 ]

12 голосов
/ 28 октября 2010

Преимуществом буферизации является эффективность. Как правило, быстрее записать блок размером 4096 байт в файл, чем записать, скажем, один байт 4096 раз.

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

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

4 голосов
/ 28 октября 2010

Иногда данные кэшируются до того, как они фактически записываются на диск (в буфере). Сброс приводит к тому, что содержимое буфера записывается на диск.

3 голосов
/ 28 октября 2010

flush указывает выходному потоку отправлять все данные в базовый поток. Это необходимо из-за внутренней буферизации. Основное назначение буфера - минимизировать обращения к API базового потока. Если я храню длинный байтовый массив в FileOutputStream, я не хочу, чтобы Java вызывала API файлов операционной системы один раз на байт. Таким образом, буферы используются на разных этапах, как внутри, так и вне Java. Даже если вы вызываете fputc один раз на байт, ОС не будет каждый раз записывать на диск, потому что у нее есть собственная буферизация.

...