Разница между java.io.PrintWriter и java.io.BufferedWriter?

97

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

// 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?

i2ijeya
источник

Ответы:

63

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

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

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

Нет такого понятия, как «PrintReader»; ближайший к вам, вероятно, java.util.Scanner .

Тофу пиво
источник
4
@TritonMan в какой-то момент ему нужно взаимодействовать с ОС, что означает выход за пределы Java.
TofuBeer
но PrintWriter также буферизуется, не так ли? так что на самом деле это не разница между ними, как можно предположить из вашего ответа
строка
PrintWriter находится в буфере, но разница в методах, которые есть у средства записи печати. Не думаю, что я
имел в виду
то, что вы написали о BufferedWriter - верно ли это и для PrintWriter или нет? мне все еще не ясно, так как я считаю, что этот ответ касается различий
строка
90

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

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

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

Джон Скит
источник
@WindyFields: Нет, PrintStreamэто файл OutputStream. PrintWriterэто а Writer.
Джон Скит
Спасибо. «он принимает исключения». Вы имеете в виду, что PrintWriter не вызывает проверенных исключений? Как насчет непроверенных исключений?
1
@Ben: Я специально говорил о том IOException, что каждая другая абстракция ввода-вывода ( Readerи Writerт. Д.) Заявляет, что ее методы вызывают, IOExceptionесли что-то пойдет не так, - PrintWriterнет.
Джон Скит,
8

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

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Кай Хуппманн
источник
2
Помня комментарий @Jons о том, что PrintWriter проглатывает исключения. checkError должен быть вызван.
MadMurf
4
По крайней мере, в текущей реализации openJDK 8 (и, возможно, в более старых версиях) PrinterWriterуже создается файл BufferedWriter.
nimrodm 01
7

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

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

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

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

Лиода
источник
3

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

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

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

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

(или)

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

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

Сайед Максуд
источник
2

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

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

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

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

Рохит Гоял
источник
0

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

Видют Сингхай
источник
-1

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

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
АджайЛохани
источник