FileWrite BufferedWriter и PrintWriter вместе взятые
Хорошо, поэтому я узнаю об I/O, и я нашел следующий код в одном из слайдов. кто-то может объяснить, почему необходимо иметь FileWrite, BufferedWriter и PrintWriter? Я знаю, что BufferedWriter должен буферизовать вывод и выкладывать его все сразу, но почему они используют FileWriter и PrintWriter? не так ли они делают то же самое с небольшой разницей в обработке ошибок и т.д.?
И почему они проходят от bw
до PrintWriter
?
FileWriter fw = new FileWriter (file);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outFile = new PrintWriter (bw);
Ответы
Ответ 1
Предположительно, они используют FileWriter
, потому что они хотят записать в файл. Оба BufferedWriter
и PrintWriter
должны быть предоставлены другому писателю для записи - вам нужен какой-то конечный пункт назначения.
(Лично мне не нравится FileWriter
, поскольку он не позволяет вам указывать кодировку. Я предпочитаю использовать FileOutputStream
, завернутый в OutputStreamWriter
, но это другое дело.)
BufferedWriter
используется для буферизации, как вы говорите, хотя он не буферизует весь вывод, а фиксированное количество (размер буфера). Он создает "chunkier", пишет основному писателю.
Что касается использования PrintWriter
- ну, это предоставляет дополнительные методы, такие как println
. Лично мне это не нравится, поскольку он проглатывает исключения (вам нужно явно проверить с помощью checkError
, который до сих пор не дает подробностей и которые я не думаю, что когда-либо видел), но опять же это зависит от того, сделав. PrintWriter
передается BufferedWriter
в качестве адресата.
Таким образом, код ниже указанного раздела предположительно будет записываться в PrintWriter
, который будет записываться в BufferedWriter
, который будет (когда его буфер заполнен или он покраснел или закрыт) напишите в FileWriter
, который, в свою очередь, преобразует символьные данные в байты на диске.
Ответ 2
Из Docs:
В общем, Writer немедленно отправляет свой вывод базовому символу или потоку байтов. Если не требуется быстрый вывод, рекомендуется обернуть BufferedWriter вокруг любого Writer, чьи операции write() могут быть дорогостоящими, например FileWriters и OutputStreamWriters. Например,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
будет буферизовать вывод PrintWriter в файл. Без буферизации каждый вызов метода print() приведет к преобразованию символов в байты, которые затем будут немедленно записаны в файл, что может быть очень неэффективным.
Вы можете понять из этого, что BufferedWriter
- эффективный способ писать материал.
Записывает текст в поток вывода символов, буферизацию символов, чтобы обеспечить эффективную запись одиночных символов, массивов и строк.
Объект A FileWriter
передается в BufferedWriter
, поскольку целью здесь является запись в некоторый выходной файл с помощью BufferedWriter
.
И, наконец, a PrintWriter
используется для print*
методов, таких как println()
.
Ответ 3
PrintWriter из здесь
Печать форматированных представлений объектов в поток текстового вывода. Этот класс реализует все методы печати, найденные в PrintStream. Он не содержит методов для записи необработанных байтов, для которых программа должен использовать незаписанные байтовые потоки.
из приведенного выше утверждения кажется, что основной причиной использования PrintWriter является получение всех методов PrintStream
, таких как println()
, println(char [] x)
и т.д.
BufferedWriter, вы правы. Это один из лучших способов записи в файл, потому что он будет буферизовать символ в виртуальную память перед записью в файл напрямую и придумал метод newLine()
.
FileWriter из здесь
FileWriter предназначен для записи потоков символов. Для записи потоки необработанных байтов, рассмотрите использование FileOutputStream
.
Ответ 4
Обычно эта цепочка Writer связана с абстракцией. PrintWriter
имеют полезные методы print
и println
, которые могут быть удобны, если вы хотите напечатать строки и строки в файле. Работая непосредственно с FileWriter
, вам нужно будет использовать более "низкий уровень" API. И, как вы говорите, BufferedWriter
- это буферизация. Таким образом, это в основном вопрос того, что вы хотите вывести в файл, и какой уровень абстракции вы предпочитаете.
Ответ 5
FileWriter
- это просто написать простой текст (без форматирования), он не использует какой-либо буферный механизм, как бы он ни начинал, он просто пишет.
BufferedWriter
является оболочкой для классов Writer
, чтобы позволить ему использовать функциональность буфера (для оптимизации IO).
PrintWriter
печатает форматированный текст, вы можете предоставить строку формата вместе с данными для печати, хотя она может напрямую работать с любым Writer/OutputStream
, просто для обеспечения буферизации, Writer/OutputStream
передается в 1 BufferedWriter
, затем для форматированного текста передается PrintWriter
Ответ 6
Объекты завернуты в этот порядок, потому что вы хотите использовать внешний PrintWriter для более сложного форматирования. BufferedWriter должен быть обернут что-то. Таким образом, FileWriter - это то, что BufferedWriter обертывает и является самым внутренним объектом.