Я думаю, что ответ лежит в истории Java.Трио InputStream
, OutputStream
и PrintStream
в java.io
восходит к Java 1.0.Это было до того, как в язык была встроена серьезная поддержка кодировок файлов и наборов символов.
Цитируя Javadoc:
"PrintStream добавляет функциональность в другой поток вывода, а именно возможностьдля удобной печати представлений различных значений данных. Также предусмотрены две другие функции. В отличие от других выходных потоков, PrintStream никогда не генерирует IOException; вместо этого в исключительных ситуациях просто устанавливается внутренний флаг, который можно проверить с помощью метода checkError ... "
Подводя итог, это удобно для генерации текстового вывода, привитого поверх ввода-вывода более низкого уровня.
В Java 1.1, Reader
, Writer
и PrintWriter
были введены.Эти все поддерживают наборы символов.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, Тогда, поскольку PrintStream
стал намного менее уместным, потому что печать по своей природе - о тексте.
В отличие от класса PrintStream, если включена автоматическая очистка, то это будет выполняться только при вызове одного из методов println (), а не всякий раз, когда происходит вывод символа новой строки.Методы println () используют собственное представление платформы о разделителе строк, а не символе новой строки.
Иными словами, PrintWriter следует использовать только через API print*(...)
, поскольку написание символов новой строки и т. Д. ДолжноОтветственность вызывающего абонента не лежит, то же самое относится и к кодировкам файлов и наборам символов. Ответственность вызывающего абонента не лежит.
Я бы сказал, что PrintWriter
должно быть вместо java.io.Printer
, а не расширяться Writer
,Я не знаю, распространялись ли они на имитацию PrintStream
, или потому что они застряли на поддержании идиомы дизайна трубы.