Java: разница между PrintStream и PrintWriter

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

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

Ответ 1

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

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

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

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

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

Ответ 2

С PrintStream вы придерживаетесь стандартного кодирования платформы.

PrintStream stream = new PrintStream(output);

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

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

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

Ответ 3

Так как JDK 1.4 можно указать кодировку символов для PrintStream. Таким образом, различия между PrintStream и PrintWriter связаны только с режимом автоматического промывки и что PrintStream не может обернуть Writer.

Ответ 4

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

Ответ 5

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

Ответ 6

Printwriter - это усовершенствование печати.

т.е. printstream для определенной цели.