Java: разница между PrintStream и PrintWriter - PullRequest
121 голосов
/ 12 мая 2010

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

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

Ответы [ 6 ]

124 голосов
/ 12 мая 2010

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

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

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

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

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

61 голосов
/ 12 мая 2010

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

PrintStream stream = new PrintStream(output);

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

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

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

17 голосов
/ 23 января 2011

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

3 голосов
/ 12 мая 2010

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

2 голосов
/ 12 мая 2010

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

0 голосов
/ 10 декабря 2016

Printwriter - это расширение printstream.

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

...