Разница между java.io.PrintWriter и java.io.BufferedWriter? - PullRequest
87 голосов
/ 17 ноября 2009

Пожалуйста, просмотрите код ниже:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

В чем разница между этими двумя методами?

Когда мы должны использовать PrintWriter поверх BufferedWriter?

Ответы [ 8 ]

80 голосов
/ 17 ноября 2009

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

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

Я не уверен, почему аспекты «дополнительные возможности форматирования» и «не глотать исключения» объединены в одном классе - форматирование, очевидно, полезно во многих местах, где вы не хотите исключения, которые нужно проглотить. Было бы неплохо увидеть, как BufferedWriter получит те же способности в какой-то момент ...

56 голосов
/ 17 ноября 2009

Справочник по API для BufferedWriter и PrintWriter подробно описывает различия.

Основная причина использования PrintWriter - получить доступ к методам printXXX, таким как println (). По сути, вы можете использовать PrintWriter для записи в файл так же, как вы используете System.out для записи в консоль.

BufferedWriter - это эффективный способ записи в файл (или что-либо еще), поскольку он буферизует символы в памяти Java до того, как (возможно, в зависимости от реализации) переместится в C для записи в файл. 1009 *

Нет такого понятия, как «PrintReader»; самый близкий, который Вы получите, вероятно, java.util.Scanner .

8 голосов
/ 17 ноября 2009

Как сказано в ответе ТофуБира, оба имеют свои особенности. Чтобы воспользоваться всеми преимуществами PrintWriter (или любого другого писателя), а также использовать буферизованную запись, вы можете обернуть BufferedWriter необходимой, например, так:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
7 голосов
/ 17 ноября 2009

PrintWriter просто предоставляет методы печати на любом Writer в символьном режиме.

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

BufferedReader позволяет читать текст из файла с байтами, преобразованными в символы. Позволяет читать построчно.

PrintReader отсутствует, вам нужно выбрать другую реализацию Reader в соответствии с форматом ввода.

2 голосов
/ 21 сентября 2018

PrintWriter - наиболее усовершенствованный модуль записи для записи символьных данных в файл.

Основное преимущество PrintWriter перед FileWriter и BufferedWriter:

  1. PrintWriter может взаимодействовать напрямую с файлом, а также может взаимодействовать через некоторый объект Writer.

PrintWriter printwriter = new PrintWriter("blah.txt");

(или)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Мы можем записать любой тип данных Primitive непосредственно в файл (потому что у нас есть дополнительные перегруженные версии методов PrintWriter, т.е. print () и println ()).

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true

2 голосов
/ 13 июня 2014

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

Примечание. Текстовое содержимое в блоках кода автоматически переносится по словам

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

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

0 голосов
/ 15 мая 2017

BufferedWriter - записывает текст в выходной поток символов, буферизует символы из потока символов PrintWriter - печатает отформатированные представления объектов в поток вывода текста.

0 голосов
/ 20 января 2014

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

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
...