Разница между PrintWriter и классом FileWriter

try{

    File file = new File("write.txt");
    FileWriter writer = new FileWriter(file);

    PrintWriter printWriter = new PrintWriter(writer);
    printWriter.println("pqr");
    printWriter.println("jkl");
    printWriter.close();

    PrintWriter printWriter = new PrintWriter(file);
    printWriter.println("abc");
    printWriter.println("xyz");
    printWriter.close();
}

Я не понимаю, в чем разница между этими двумя способами. В каком сценарии я должен использовать printWriter и fileWriter.

6
добавлено отредактировано
Просмотры: 2
nl ja de
Пожалуйста, найдите вопрос, уже отвеченный на stackoverflow ......... stackoverflow.com/questions/5759925/…
добавлено автор Prateek, источник
Вы сделали это в Google?
добавлено автор Muhammad Imran Tariq, источник

4 ответы

Хотя оба из них внутренне используют FileOutputStream, основное отличие заключается в том, что PrintWriter предлагает некоторые дополнительные методы для форматирования, такие как println и printf.

фрагменты кода:

public PrintWriter(File file) throws FileNotFoundException {
     this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
     false);
}


public FileWriter(File file) throws IOException {
       super(new FileOutputStream(file));
}

Основные отличия:

  1. FileWriter выбрасывает IOException в случае сбоя IO.
  2. Ни один из методов PrintWriter не генерирует IOException, вместо этого они устанавливают логический флаг, который может быть получен с помощью checkError ().
  3. PrintWriter поставляется с возможностью автозапуска при создании (по умолчанию без автозапуска), который будет очищаться после каждого байта данных. В случае FileWriter вызывающий должен позаботиться о том, чтобы вызывать флеш.
4
добавлено
спасибо за ваши данные. исправил мой ответ в соответствии с вашими комментариями.
добавлено автор Rahul, источник
Это неправильно: PrintWriter автоматически вызывает сброс после каждого байта данных, написанного . Вы можете создать объект с автопотоком, но по умолчанию он не имеет автоматической очистки. Смотрите здесь
добавлено автор Math, источник
@Math, я думаю, вы вводите в заблуждение класс PrintWriter с классом PrintStream, потому что в классе PrintWriter, если в момент создания объекта запрашивается автоматическая промывка, то это будет сделано , только когда один из параметров println (), printf() , вызывается метод format() и не всегда.
добавлено автор sactiw, источник
@ Точка Матса абсолютно правильная. PrintWriter может быть создан с помощью autoflush, но конструктор по умолчанию устанавливает его в значение false (см. Javadoc/исходный код). Таким образом, третий пункт ответа - вводящий в заблуждение ИМО; он должен читать: «PrintWriter может быть создан для автоматической очистки ...».
добавлено автор mrod, источник

PrintWriter gives you some handy methods for formatting like println and printf. So if you need to write printed text - you can use it. FileWriter is more like "low-level" writer that gives you ability to write only strings and char arrays. Basically I don't think there is a big difference what you choose.

1
добавлено

Хотя FileWriter имеет только базовый набор методов, PrintWriter имеет богатый набор методов удобства, один из которых приведен в вашем примере - PrintWriter.println .

Вы также должны иметь в виду, что «методы в этом классе никогда не генерируют исключения ввода-вывода, хотя некоторые из его конструкторов могут. Клиент может узнать, произошли ли какие-либо ошибки, вызвав checkError ()»,

0
добавлено

Из источника, который делает PrintWriter при передаче файла, является его открытие в буферизованном способе

public PrintWriter(File file) throws FileNotFoundException {
    this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
         false);
}

if you pass it a FileWriter, it will open it, without buffering

public FileWriter(File file) throws IOException {
    super(new FileOutputStream(file));
}

Это означает, что первый пример может быть несколько более эффективным. Однако я бы использовал File без FileWriter , потому что для меня это проще.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async