Это может показаться легкомысленным, но PrintStreamпечать в файл OutputStreamи PrintWriterпечать в файл Writer. Хорошо, я сомневаюсь, что получу какие-то очки за утверждение очевидного. Но это еще не все.
Итак, в чем разница между an OutputStreamи a Writer? Оба являются потоками, с основным отличием в том, что a OutputStream- это поток байтов, а a Writer- это поток символов.
А если имеет OutputStreamдело с байтами, что насчет PrintStream.print(String)? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, поскольку это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы создаете файл на одной платформе и используете его на другой.
С помощью a Writerвы обычно указываете используемую кодировку, избегая каких-либо зависимостей от платформы.
Зачем иметь PrintStreamв JDK, если основная цель - писать символы, а не байты? PrintStreamпредшествовал JDK 1.1, когда были введены потоки символов Reader / Writer. Я полагаю, что Sun отказался PrintStreamбы от поддержки, если бы только потому, что он так широко используется. ( В конце концов, вы не хотели бы каждый вызов , System.outчтобы сгенерировать устаревший API предупреждение! Кроме того , изменение типа от PrintStreamдо PrintWriterна стандартных выходных потоков порвали бы существующие приложения.)