2010-05-12 4 views
112

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

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

+1

+1 Хороший вопрос, я также смешиваю эти два класса, и API-документ также не помогает. – helpermethod

+0

Еще одно отличие заключается в том, как работает автофлюш. Для писателя наличие символа \ n в выходных триггерах flush(). Но в потоке байтов (PrintStream) есть только байты. autoflush затем работает, как описано в Javadoc, на основе: «собственного понятия платформы о разделителе строк, а не символа новой строки». – mins

ответ

117

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

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

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

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

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

+2

Это то, о чем я подумал, но это неправда. Даже PrintStream поддерживает Writer под капотом - если вы передадите ему OutputStream, он обернет его. –

+2

@Jon - внутри, есть Writer, но он записывается в OutputStream, поэтому чистый эффект заключается в том, что PrintStream записывает в OutputStream - преобразование char в байт происходит и использует кодировку платформы по умолчанию. Нет такого требования для преобразования char-> byte в PrintWriter, вы можете оставаться с символами полностью. – mdma

+0

«Кодировка по умолчанию определяется во время запуска виртуальной машины, а обычно зависит от языка и кодировки базовой операционной системы .», Также Locale меняет кодировку по умолчанию на некоторых платформах. – Pindatjuh

3

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

+1

За исключением PrintStream, потому что тот берет кодировку, чтобы она могла обрабатывать бит больше, чем стандартный OutputStream. –

+0

Звучит странно, что System.out, единственной целью которого является печать строк, на самом деле является PrintStream. – mins

+0

«Писатели обрабатывают набор символов для вас» - только писатели, которые занимаются преобразованием символов в байты. Не все писатели. – Aivar

2

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

+0

С PrintStream можно также указать кодировку – Aivar

58

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

PrintStream stream = new PrintStream(output); 

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

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

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

+38

+1 для обучения меня новому слову, mojibake :) – Jonik

+7

С 1.4, есть новый конструктор для PrintStream, который принимает кодировку «PrintStream (OutputStream out, boolean autoFlush, String encoding)» – artbristol

+0

спасибо! - Я точно искал способ печати в массив байтов с определенной кодировкой. –

17

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

-1

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

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