Java: различие между PrintStream и PrintWriter

Между чем различие PrintStream и PrintWriter? У них есть много методов, общих, из-за которого я часто перепутываю эти два класса. Кроме того, я думаю, что мы можем использовать их для точно того же самого. Но должно быть различие, иначе, был бы только один класс.

Я искал архивы, но не мог найти этот вопрос.

121
задан Shubham Goyal 21 October 2012 в 18:25
поделиться

4 ответа

Это может показаться легкомысленным, но PrintStream печатает в OutputStream и PrintWriter печатает на Writer . Хорошо, я сомневаюсь, что получу какие-то баллы за утверждение очевидного. Но это еще не все.

Итак, в чем разница между OutputStream и Writer ? Оба являются потоками, с основным отличием OutputStream - это поток байтов, а Writer - это поток символов.

Если OutputStream имеет дело с байтами, как насчет PrintStream.print (String) ? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, поскольку это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы создаете файл на одной платформе и используете его на другой.

В Writer вы обычно указываете кодировку для использования, избегая каких-либо зависимостей от платформы.

Зачем иметь в JDK PrintStream , если основное предназначение - писать символы, а не байты? PrintStream предшествует JDK 1.1, когда были введены потоки символов Reader / Writer.Я полагаю, что Sun отказалась бы от PrintStream , если бы только потому, что он так широко используется. (В конце концов, вы не хотите, чтобы каждый вызов System.out генерировал предупреждение об устаревшем API! Кроме того, изменение типа с PrintStream на PrintWriter на стандартные выходные потоки нарушили бы существующие приложения.)

126
ответ дан 24 November 2019 в 01:32
поделиться

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

2
ответ дан 24 November 2019 в 01:32
поделиться

Писатели, такие как PrintWriter, предназначены для вывода текста, потоки - для двоичного вывода. Писатели обрабатывают набор символов за вас. Потоки этого не делают, потому что предполагается, что вам не нужно такое преобразование, которое испортит ваши двоичные данные, и вы будете использовать писатель.

3
ответ дан 24 November 2019 в 01:32
поделиться

С помощью PrintStream вы придерживаетесь кодировки платформы по умолчанию.

PrintStream stream = new PrintStream(output);

Однако с помощью PrintWriter вы можете передать OutputStreamWriter с определенной кодировкой.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Преимущество в том, что вы можете управлять кодировкой символов, в которой должны быть написаны символы, чтобы они в конечном итоге не превратились в mojibake .

60
ответ дан 24 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: