FileWrite BufferedWriter и PrintWriter вместе взятые

Хорошо, поэтому я узнаю об I/O, и я нашел следующий код в одном из слайдов. кто-то может объяснить, почему необходимо иметь FileWrite, BufferedWriter и PrintWriter? Я знаю, что BufferedWriter должен буферизовать вывод и выкладывать его все сразу, но почему они используют FileWriter и PrintWriter? не так ли они делают то же самое с небольшой разницей в обработке ошибок и т.д.?

И почему они проходят от bw до PrintWriter?

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);

Ответы

Ответ 1

Предположительно, они используют FileWriter, потому что они хотят записать в файл. Оба BufferedWriter и PrintWriter должны быть предоставлены другому писателю для записи - вам нужен какой-то конечный пункт назначения.

(Лично мне не нравится FileWriter, поскольку он не позволяет вам указывать кодировку. Я предпочитаю использовать FileOutputStream, завернутый в OutputStreamWriter, но это другое дело.)

BufferedWriter используется для буферизации, как вы говорите, хотя он не буферизует весь вывод, а фиксированное количество (размер буфера). Он создает "chunkier", пишет основному писателю.

Что касается использования PrintWriter - ну, это предоставляет дополнительные методы, такие как println. Лично мне это не нравится, поскольку он проглатывает исключения (вам нужно явно проверить с помощью checkError, который до сих пор не дает подробностей и которые я не думаю, что когда-либо видел), но опять же это зависит от того, сделав. PrintWriter передается BufferedWriter в качестве адресата.

Таким образом, код ниже указанного раздела предположительно будет записываться в PrintWriter, который будет записываться в BufferedWriter, который будет (когда его буфер заполнен или он покраснел или закрыт) напишите в FileWriter, который, в свою очередь, преобразует символьные данные в байты на диске.

Ответ 2

Из Docs:

В общем, Writer немедленно отправляет свой вывод базовому символу или потоку байтов. Если не требуется быстрый вывод, рекомендуется обернуть BufferedWriter вокруг любого Writer, чьи операции write() могут быть дорогостоящими, например FileWriters и OutputStreamWriters. Например,

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

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

Вы можете понять из этого, что BufferedWriter - эффективный способ писать материал.

Записывает текст в поток вывода символов, буферизацию символов, чтобы обеспечить эффективную запись одиночных символов, массивов и строк.

Объект A FileWriter передается в BufferedWriter, поскольку целью здесь является запись в некоторый выходной файл с помощью BufferedWriter.

И, наконец, a PrintWriter используется для print* методов, таких как println().

Ответ 3

PrintWriter из здесь

Печать форматированных представлений объектов в поток текстового вывода. Этот класс реализует все методы печати, найденные в PrintStream. Он не содержит методов для записи необработанных байтов, для которых программа должен использовать незаписанные байтовые потоки.

из приведенного выше утверждения кажется, что основной причиной использования PrintWriter является получение всех методов PrintStream, таких как println(), println(char [] x) и т.д.

BufferedWriter, вы правы. Это один из лучших способов записи в файл, потому что он будет буферизовать символ в виртуальную память перед записью в файл напрямую и придумал метод newLine().

FileWriter из здесь

FileWriter предназначен для записи потоков символов. Для записи потоки необработанных байтов, рассмотрите использование FileOutputStream

.

Ответ 4

Обычно эта цепочка Writer связана с абстракцией. PrintWriter имеют полезные методы print и println, которые могут быть удобны, если вы хотите напечатать строки и строки в файле. Работая непосредственно с FileWriter, вам нужно будет использовать более "низкий уровень" API. И, как вы говорите, BufferedWriter - это буферизация. Таким образом, это в основном вопрос того, что вы хотите вывести в файл, и какой уровень абстракции вы предпочитаете.

Ответ 5

FileWriter - это просто написать простой текст (без форматирования), он не использует какой-либо буферный механизм, как бы он ни начинал, он просто пишет.

BufferedWriter является оболочкой для классов Writer, чтобы позволить ему использовать функциональность буфера (для оптимизации IO).

PrintWriter печатает форматированный текст, вы можете предоставить строку формата вместе с данными для печати, хотя она может напрямую работать с любым Writer/OutputStream, просто для обеспечения буферизации, Writer/OutputStream передается в 1 BufferedWriter, затем для форматированного текста передается PrintWriter

Ответ 6

Объекты завернуты в этот порядок, потому что вы хотите использовать внешний PrintWriter для более сложного форматирования. BufferedWriter должен быть обернут что-то. Таким образом, FileWriter - это то, что BufferedWriter обертывает и является самым внутренним объектом.