Разница между 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?

Ответы:


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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.