Java IO (javase 6) - помогите мне понять влияние моего примера использования Streams и Writers - PullRequest
1 голос
/ 11 февраля 2010
BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

Итак, давайте посмотрим, пойму ли я это: открыт поток байтов для файла "out.txt". Затем он подается в буферизованный поток вывода, чтобы ускорить файловые операции. Буферизованный поток подается в модуль записи выходного потока, чтобы соединить байты с символами. Наконец, этот писатель передается буферизованному писателю, который добавляет еще один уровень буферизации?

Хм ...

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

Да, вы правы.

Я думаю, что в этом случае вы могли бы сделать намного короче (см. Также BufferedWriter )

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out"));

или если вы хотите хорошийфункции печати:

PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter ("foo.out")));

Возможно, FileWriter создает свою собственную упаковку, ноэтот класс будет знать, какой путь лучше всего.

В java Streams и Writers являются обертками, так что вы можете собирать их для своих собственных нужд (с помощью стекирования, как вы делаете).Классы не смотрят на какой тип потока / устройства записи они укладываются.В вашем случае наличие нескольких буферов будет означать, что у вас фактически есть два буфера в двух разных классах.Это означает, что они будут занимать некоторую дополнительную память и, возможно, некоторую потерю производительности, но, скорее всего, вы никогда этого не заметите (потому что это только небольшая нагрузка по сравнению с другими факторами производительности).

0 голосов
/ 12 апреля 2010

Это пример шаблона декоратора . Идея состоит в том, чтобы добавить функциональность в класс без изменения класса. В вашем примере у вас есть FileWriter. Вы хотите, чтобы все, что вы пишете, было помещено в буфер (хорошая идея, если это по сети), прежде чем писать. Таким образом, вы накладываете BufferedWriter поверх FileWriter. Другие приложения могут не захотеть буферизовать данные, поэтому разработчикам не нужно добавлять BufferedWriter.

Мы не можем предвидеть, что понадобится всем разработчикам. Скажем, вам нужно rot13 ваших данных, теперь вместо изменения FileWriter вы создаете вызов класса Rot13Writer, который реализует Writer. Rot13Writer возьмет экземпляр Writer и выполнит rot13, прежде чем передать его следующему писателю.

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