DataOutputStream () VS DataOutputStream (новый BufferedOutputStream ()) - PullRequest
10 голосов
/ 13 ноября 2011

Код 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));

Как утверждает на этой странице , DataStreams уже предоставляет поток байтов вывода буферизованного файла. Так действительно ли требуется двойная буферизация?

Я изменил 2 строки кода (вывод и ввод), убрав BufferedOutputStream и BufferedInputStream, и все, кажется, работает просто отлично, поэтому мне было интересно, какова цель BufferedOutputStream и BufferedInputStream?

Ответы [ 4 ]

9 голосов
/ 13 ноября 2011

Обертывание FileOutputStream в BufferedOutputStream обычно ускоряет общий вывод вашей программы.Это будет заметно только в том случае, если вы пишете большие объемы данных.То же самое касается упаковки InputStream в BufferedInputStream.Использование буферов влияет только на эффективность, а не на правильность.

4 голосов
/ 13 ноября 2011

Это не лишнее, просто другое. Варианты Buffered добавляют слой буферизации, ускоряя операции ввода-вывода за счет пакетного чтения и записи.

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

2 голосов
/ 13 ноября 2011

Раньше я думал, что модель ввода-вывода Java была излишне большой, но теперь, когда я действительно «понял», я нахожу ее довольно элегантной. BufferedOutputStream является реализацией шаблона Decorator (Google это ... это полезно). Это означает, что BufferedOutputStream просто добавляет функциональность к выходному потоку, который он оборачивает. Внутренне, BufferedOutputStream вызывает то, что когда-либо OutputStream это украшает.

1 голос
/ 13 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...