DataOutputStream() VS DataOutputStream (новый BufferedOutputStream())
В коде Java Tutorials показан пример использования класса DataOutputStream
и DataInputStream
.
Отрывок кода выглядит следующим образом:
//..
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
//..
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
//..
Мне было интересно, почему требуется создать новый BufferedOutputStream
при создании нового DataOutputStream
?
Разве это не избыточно, так как этот вариант работает?: new DataOutputStream(new FileOutputStream(dataFile));
Как эта страница утверждает, что DataStream уже предоставляет поток байтов с буферизованным файлом. Так нужна ли "двойная буферизация"?
Я изменил 2 строки кода (вывод и ввод), убрав BufferedOutputStream
и BufferedInputStream
, и все, кажется, работает очень хорошо, поэтому мне было интересно, что является целью BufferedOutputStream
и BufferedInputStream
?
Ответы
Ответ 1
Обтекание FileOutputStream в BufferedOutputStream обычно ускоряет общий вывод вашей программы. Это будет заметно, если вы пишете большие объемы данных. То же самое происходит для упаковки InputStream в BufferedInputStream. Использование буферов повлияет только на эффективность, а не на правильность.
Ответ 2
Это не избыточно, это просто другое. Варианты Buffered
добавляют уровень буферизации, ускоряя операции ввода-вывода, дозируя чтение и запись.
Вместо того, чтобы идти на диск для каждого чтения/записи, он сначала переходит в память. Какая разница, зависит от множества факторов. Система OS и/или дискового ввода-вывода также, вероятно, выполняет некоторую буферизацию.
Ответ 3
Буферизованные потоки ввода-вывода помогают вам читать навалом, что значительно снижает стоимость ввода-вывода. Вложения IO довольно дорогостоящие. Представьте, что ваше приложение выполняет полный цикл чтения/записи для каждого байта, который читается/записывается, в отличие от чтения/записи фрагмента данных за один раз. Выполнение буферизованного чтения/записи, безусловно, очень эффективно. Вы заметите огромную разницу в эффективности, если вы соберете статистику производительности как в случаях, так и без буферизации IO, особенно при чтении/записи огромного объема данных.
Ответ 4
Раньше я думал, что модель Java IO была излишне большой, но теперь, когда я действительно "получаю ее", я нахожу ее довольно элегантной. BufferedOutputStream - это реализация шаблона Decorator (google it... it useful). Это означает, что BufferedOutputStream просто добавляет функциональность в выходной поток, который он обертывает. Внутри BufferedOutputStream вызывает то, что когда-либо выделяет OutputStream.