FileWrite BufferedWriter и PrintWriter вместе

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

А также почему они передают bw в PrintWriter?

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

person Ahoura Ghotbi    schedule 04.04.2013    source источник


Ответы (6)


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

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

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

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

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

person Jon Skeet    schedule 04.04.2013
comment
вы говорите передать BufferedWriter в PrintWriter. Это действительно необходимо? PrintWriter сам буферизуется. Попробуйте напечатать что-нибудь, не сбрасывая его. - person Rollerball; 20.06.2013
comment
@Rollerball: я говорю, что OP делает это. Вполне возможно, что BufferedWriter не имеет значения. - person Jon Skeet; 21.06.2013
comment
@Rollerball, если вы не передаете BufferedWriter в PrintWriter, в документах говорится, что .. без буферизации каждый вызов метода print() приведет к преобразованию символов в байты, которые затем будут немедленно записаны в файл, что может быть очень неэффективно ... - person nachokk; 11.01.2014
comment
@Jon спасибо за указание на хорошие альтернативы (такие как FileOutputStream и OutputStreamWriter). Я давно не пользовался PrintWriter, но не знал о checkError! - person Ryan; 16.05.2016

Из документов:

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

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

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

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

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

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

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

person Community    schedule 04.04.2013

PrintWriter из здесь

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

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

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

FileWriter из здесь

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

.

person subodh    schedule 04.04.2013

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

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

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

person Ankit    schedule 04.04.2013

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

person NilsH    schedule 04.04.2013

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

person Richard Wеrеzaк    schedule 04.04.2013