Gymterview
junior

Какие классы позволяют ускорить чтение/запись за счет использования буфера?

Буферизованные потоки накапливают данные во внутреннем массиве (буфере) и выполняют операции ввода/вывода блоками, а не побайтно/посимвольно, что значительно сокращает количество системных вызовов.

Аналогия из жизни: без буфера — это как носить воду из колодца по одному стакану. С буфером — вы берёте ведро, наполняете его у колодца и затем используете воду из ведра, ходя к колодцу в разы реже.

Буферизованные классы

Класс Оборачивает Конструкторы
BufferedInputStream InputStream (InputStream in), (InputStream in, int size)
BufferedOutputStream OutputStream (OutputStream out), (OutputStream out, int size)
BufferedReader Reader (Reader in), (Reader in, int sz)
BufferedWriter Writer (Writer out), (Writer out, int sz)

Размер буфера по умолчанию — 8192 байт (8 КБ) для байтовых и 8192 символов для символьных потоков. Для файлов размером в несколько мегабайт и выше можно увеличить буфер до 32-64 КБ для повышения производительности.

BufferedReader добавляет метод readLine() для построчного чтения и lines() для получения Stream<String>. BufferedWriter добавляет метод newLine() для вставки платформо-зависимого символа перевода строки.

Важный нюанс

При использовании BufferedOutputStream или BufferedWriter данные могут оставаться в буфере и не быть записаны на диск. Для гарантии записи необходимо вызвать flush() или закрыть поток через close() (который вызывает flush() автоматически).

На собеседовании: назовите четыре буферизованных класса и поясните принцип — замена множества мелких системных вызовов одним крупным. Бонус — упомянуть размер буфера по умолчанию (8 КБ) и необходимость flush.