Мне интересно задание BufferedOutputStream, повышение производительности при его использовании?
Какова цель BufferedOutputStream?
Ответ 1
Вот строка из API BufferedOutputStream:
Класс реализует буферный выходной поток. Путем настройки такого выходного потока приложение может записывать байты в базовый выходной поток без, обязательно вызывающий вызов базовой системы для каждого записанного байта.
Он может выполнять большую часть операций в буфере и без вызова базовой системы.
Например, рассмотрим запись в файл: без буфера, он должен сделать системный вызов для каждого байта, что явно медленнее.
Ответ 2
Как следует из его названия, BufferOutputStream
имеет внутренний буфер (byte[]
), к которому сначала копируется содержимое отдельных небольших записей. Они записываются в базовый OutputStream
, когда буфер заполнен, или поток очищается, или поток закрыт.
Это может иметь большое значение, если для каждой операции записи есть (относительно большие) фиксированные накладные расходы для базового OutputStream
, как это имеет место для FileOutputStream
(который должен сделать вызов операционной системы) и многих сжатых потоков.
В то же время многие потоковые библиотеки используют свою собственную буферизацию (например, писатели XML и JSON), а использование BufferedOutputStream
не дает никакой пользы. Но его собственные накладные расходы относительно низки, поэтому риск невелик.
Ответ 3
BufferedOutputStream обеспечивает буферизацию выходных данных, что повышает эффективность, сохраняя значения, которые должны быть записаны в буфер, и фактически записывать их при заполнении буфера или при вызове метода flush().