Это может показаться легкомысленным, но 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
на стандартных выходные потоках порвали бы существующие приложения.)
+1 Хороший вопрос, я также смешиваю эти два класса, и API-документ также не помогает. – helpermethod
Еще одно отличие заключается в том, как работает автофлюш. Для писателя наличие символа \ n в выходных триггерах flush(). Но в потоке байтов (PrintStream) есть только байты. autoflush затем работает, как описано в Javadoc, на основе: «собственного понятия платформы о разделителе строк, а не символа новой строки». – mins