В чем разница между PrintStream
и PrintWriter
? У них много общих методов, из-за чего я часто смешиваю эти два класса. Более того, я думаю, что мы можем использовать их для тех же целей. Но разница должна быть, иначе класс был бы только один.
Я просмотрел архивы, но не смог найти этот вопрос.
java
io
printwriter
printstream
Мартин Курто
источник
источник
Ответы:
Это может показаться легкомысленным, но
PrintStream
печать в файлOutputStream
иPrintWriter
печать в файлWriter
. Хорошо, я сомневаюсь, что получу какие-то очки за утверждение очевидного. Но это еще не все.Итак, в чем разница между an
OutputStream
и aWriter
? Оба являются потоками, с основным отличием в том, что aOutputStream
- это поток байтов, а aWriter
- это поток символов.А если имеет
OutputStream
дело с байтами, что насчетPrintStream.print(String)
? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, поскольку это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы создаете файл на одной платформе и используете его на другой.С помощью a
Writer
вы обычно указываете используемую кодировку, избегая каких-либо зависимостей от платформы.Зачем иметь
PrintStream
в JDK, если основная цель - писать символы, а не байты?PrintStream
предшествовал JDK 1.1, когда были введены потоки символов Reader / Writer. Я полагаю, что Sun отказалсяPrintStream
бы от поддержки, если бы только потому, что он так широко используется. ( В конце концов, вы не хотели бы каждый вызов ,System.out
чтобы сгенерировать устаревший API предупреждение! Кроме того , изменение типа отPrintStream
доPrintWriter
на стандартных выходных потоков порвали бы существующие приложения.)источник
PrintStream
использование кодировки по умолчанию для платформы не ограничивается; есть конструкторы, которые принимают имя набора символов. Таким образом, различия междуPrintStream
иPrintWriter
заключаются в том, что aPrintWriter
не может записывать необработанные байты и эти два класса переносят разные типы адресатов.PrintStream
,print()
которые вызывают удобные функцииwrite()
, поэтому они запускают автозапуск, если он включен.PrintWriter
с другой стороны, не будет автоматически запускаться после вызоваprint()
. Сегодня я демонстрировал некоторым новичкам Java, и это привлекло внимание некоторых студентов, которые не были знакомы с необходимостью ручной промывки. В противном случае ваш ответ отличный.С помощью
PrintStream
вы застряли в кодировке платформы по умолчанию.Однако с помощью
PrintWriter
вы можете передатьOutputStreamWriter
с определенной кодировкой.Преимущество состоит в том, что вы можете управлять кодировкой символов, в которой должны быть написаны символы, чтобы они в конечном итоге не превратились в моджибаке .
источник
PrintStream(OutputStream out, boolean autoFlush, String encoding)
Начиная с JDK 1.4, можно указать кодировку символов для PrintStream. Таким образом, различия между PrintStream и PrintWriter связаны только с автоматическим сбросом и тем, что PrintStream не может обернуть Writer.
источник
Такие писатели, как PrintWriter, предназначены для вывода текста, потоки - для двоичного вывода. Сценаристы сделают за вас набор символов. Потоки этого не делают, потому что предполагается, что вы не хотите такого рода преобразования, которое могло бы испортить ваши двоичные данные, и в этом случае вы бы использовали писатель.
источник
Вы можете записывать необработанные байты в Stream, а не в Writer. В PrintWriter списки Javadoc другие различия ( что самое главное, будучи в состоянии установить кодировку на поток , поэтому он может интерпретировать необработанные байты , я бы сказал).
источник
из ядра java от Хорстманна
источник
Printwriter - это усовершенствование printstream.
IE printstream для определенной цели.
источник