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

Прочтите код ниже:

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

Ответ 1

http://java.sun.com/javase/6/docs/api/java/io/BufferedWriter.html и http://java.sun.com/javase/6/docs/api/java/io/PrintWriter.html детализируйте различия.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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