2

С this tutorial,Как буферизованный ввод-вывод уменьшает накладные расходы, которые могут возникнуть при использовании небуферизованного ввода-вывода?

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

Чтобы уменьшить этот накладные расходы, платформа Java реализует буферизованные потоки ввода-вывода . Буферизованные входные потоки считывают данные из известной области памяти как буфер ; API-интерфейс нативного ввода называется только тогда, когда буфер пуст. Аналогично, буферизованные выходные потоки записывают данные в буфер, а API-интерфейс собственного выхода вызывается только тогда, когда буфер заполнен.

Я понимаю, что такие операции, как доступ к диску, сетевая активность и т. Д., Приведут к нехватке памяти или времени выполнения для базовой ОС.

Вопрос: как программа считывает/записывает в определенную область памяти (буфер), уменьшает эти накладные расходы?

Я рассматриваю это как дополнение нескольких дополнительных шагов: сначала программа запрашивает ОС, например, считывает данные из файла и записывает их в буфер, а затем программа считывает их из буфера.

+2

Ну, моя оперативная память намного быстрее, чем мой жесткий диск, и имеет лучшее соединение с ЦП, чем жесткий диск или SSD. – Tom

+1

В дополнение к ответу @ Code-Apprententice вы можете проверить это http://stackoverflow.com/questions/9648811/specific-difference-between-bufferedreader-and-filereader –

ответ

2

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

+0

Спасибо. Но означает ли это также, что последний абзац из моего вопроса правильный, то есть использование буферизованных потоков все еще требует запроса ОС на выборку данных, например, на дисковый накопитель, и сохранение их в нашем буфере; откуда наша программа будет читать его. Я имею в виду, я должен отнять у этого, что буферы полезны, потому что, как только данные были помещены в буфер (базовой ОС), наша программа может читать ее снова и снова, несколько раз, без запроса ОС каждый раз , – Solace

+1

@Solace Да, путем буферизации мы можем уменьшить количество запросов к ОС для выполнения операции ввода-вывода. Это полезно не только для чтения одних и тех же данных снова и снова, но и для чтения непрерывных данных, например, из файла или сети. –