Різниця між java.io.PrintWriter та java.io.BufferedWriter?


94

Будь ласка, перегляньте код нижче:

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

Відповіді:


61

Посилання API для BufferedWriter та PrintWriter деталізує відмінності.

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

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

Не існує такого поняття, як "PrintReader"; найближчий ви отримаєте, ймовірно, java.util.Scanner .


4
@TritonMan в якийсь момент йому потрібно взаємодіяти з ОС, що означає вийти за межі Java.
TofuBeer

89

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

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

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


@WindyFields: Ні, PrintStreamє OutputStream. PrintWriterє Writer.
Джон Скіт

Дякую. "вона ковтає винятки." Ви маєте на увазі, що PrintWriter не містить перевірених винятків? Як щодо неперевірених excepitons?

@Ben: Я конкретно кажу про IOException, в тому , що кожен IO абстракції ( Reader, і Writerт.д.) заявляє , що його методи викидають IOExceptionякщо що - то піде не так - PrintWriterні.
Джон Скіт

8

Як сказано у відповіді TofuBeer, обидва мають свої особливості. Щоб повною мірою скористатися PrintWriter (або будь-яким іншим автором), а також використовувати буферизовану письмову форму, ви можете обернути BufferedWriter потрібним таким:

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

2
Пам'ятаючи коментар @Jons, що PrintWriter поглине винятки. слід викликати помилку.
MadMurf

1
Я полюбив королівські тененбауми
Оген

4
Принаймні, у поточній реалізації openJDK 8 (і, мабуть, у старих версіях) PrinterWriterвже створено a BufferedWriter.
nimrodm

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 навколо будь-якого записувача, чиї операції 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.