Java IO (javase 6). Помогите мне понять последствия моего примера использования потоков и модулей записи.

StackOverflow https://stackoverflow.com/questions/2243441

  •  19-09-2019
  •  | 
  •  

Вопрос

BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

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

Хм...

Это было полезно?

Решение

Да вы правы.

Я думаю, что в этом случае вы могли бы сделать намного короче (см. также Буферизованный писатель)

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

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

PrintWriter out = новый PrintWriter(новый BufferedWriter(новый FileWriter("foo.out")));

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top