Это может показаться легкомысленным, но 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
в стандартных выходных потоках привело бы к поломке существующих приложений.)