Разница между 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?
9 ответов
Справочник по API для BufferedWriter и PrintWriter подробно описывает различия.
Основная причина использования PrintWriter - получить доступ к таким методам printXXX, как println(). По сути, вы можете использовать PrintWriter для записи в файл так же, как вы бы использовали System.out для записи в консоль.
BufferedWriter - это эффективный способ записи в файл (или что-либо еще), так как он будет буферизовать символы в памяти Java до того, как (возможно, в зависимости от реализации) перейдет на C, чтобы выполнить запись в файл.
Нет такого понятия, как "PrintReader"; самое близкое, что вы получите, это, вероятно, java.util.Scanner.
PrintWriter
дает больше методов (println
), но самое важное (и тревожное) различие, о котором следует знать, - это то, что он поглощает исключения.
Ты можешь позвонить checkError
позже, чтобы увидеть, произошли ли какие-либо ошибки, но обычно вы используете PrintWriter
для таких вещей, как запись на консоль - или в "быстрых и грязных" приложениях, где вы не хотите, чтобы вас беспокоили исключения (и где долговременная надежность не является проблемой).
Я не уверен, почему аспекты "дополнительных возможностей форматирования" и "не глотать исключения" объединены в одном классе - форматирование, очевидно, полезно во многих местах, где вы не хотите, чтобы исключения глотались. Было бы приятно увидеть BufferedWriter
получить те же способности в какой-то момент...
Как сказано в ответе ТофуБира, оба имеют свои особенности. Чтобы воспользоваться всеми преимуществами PrintWriter (или любого другого писателя), а также использовать буферизованную запись, вы можете обернуть BufferedWriter необходимой, например, так:
PrintWriter writer = new PrintWriter(
new BufferedWriter (
new FileWriter("somFile.txt")));
PrintWriter просто предоставляет методы печати на любом Writer в символьном режиме.
BufferedWriter более эффективен, чем его буферизованные методы. И он поставляется с методом newLine(), в зависимости от вашей системной платформы, для правильной работы с текстовыми файлами.
BufferedReader позволяет читать текст из файла с байтами, преобразованными в символы. Это позволяет читать построчно.
PrintReader отсутствует, вам нужно выбрать другую реализацию Reader в соответствии с форматом вашего ввода.
PrintWriter - самый улучшенный Writer для записи символьных данных в файл.
Основное преимущество PrintWriter перед FileWriter и BufferedWriter:
- PrintWriter может взаимодействовать напрямую с файлом, а также может взаимодействовать через некоторый объект Writer.
PrintWriter printwriter = new PrintWriter("blah.txt");
(или же)
FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
Мы можем записать любой тип данных Primitive непосредственно в файл (потому что у нас есть дополнительные перегруженные версии методов PrintWriter, например, print() и println()).
printwriter.print(65); //65
bufferedwriter.write(65); //A
printwriter.println(true); //true
Как правило, Writer отправляет свои выходные данные непосредственно в основной символ или поток байтов. Если не требуется быстрый вывод, желательно обернуть BufferedWriter вокруг любого Writer, чьи операции write() могут быть дорогостоящими, например FileWriters и OutputStreamWriters. Например,
Примечание. Текстовое содержимое в блоках кода автоматически переносится словами
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
буферизует вывод PrintWriter в файл. Без буферизации каждый вызов метода print() приведет к преобразованию символов в байты, которые затем будут немедленно записаны в файл, что может быть очень неэффективным.
BufferedWriter - записывает текст в выходной поток символов, буферизуя символы из потока символов. PrintWriter - печатает отформатированные представления объектов в поток вывода текста.
FileWriter и BufferedWriter нуждаются в новом разделителе строк для каждой строки, просто представьте, что вам нужно написать 100 строк, тогда как в PrintWriter есть метод println(), который делает это. Самое главное, что FileWriter и BufferedWriter могут записывать ТОЛЬКО типы данных char и String, тогда как PrintWriter также может записывать типы данных int, double и boolean.
Я думаю, что причина использования PrintWriter уже упоминалась выше, но одна из важных причин заключается в том, что вы передаете файловый объект непосредственно в конструктор PrintWriter, что облегчает его использование.
File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);