PrintWriter - автоматическая головоломка

public PrintWriter(OutputStream out, логическое autoFlush):

out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods
will flush the output buffer

public PrintStream (OutputStream out, логическое autoFlush):

out - The output stream to which values and objects will be printed 
autoFlush - A boolean; if true, the output buffer will be flushed 
whenever a byte array is written, one of the println methods is invoked, 
or a newline character or byte ('\n') is written

Какова была причина изменения логики автозапуска между этими классами?

Потому что они всегда считаются идентичными, за исключением моментов кодирования и "автоматической промывки" без print() вряд ли соответствует принципу наименьшего удивления, встречаются глупые ошибки:
Я создал PrintWriter с включенной автозаполнением; почему это не автозапуск?

2 ответа

Решение

Я думаю, что ответ лежит в истории Java. Трио InputStream, OutputStream а также PrintStream в java.io вернуться к Java 1.0. Это было до того, как в язык была встроена серьезная поддержка кодировок файлов и наборов символов.

Процитирую Javadoc:

"PrintStream добавляет функциональность к другому выходному потоку, а именно возможность удобной печати представлений различных значений данных. Также предоставляются две другие функции. В отличие от других выходных потоков, PrintStream никогда не генерирует IOException; вместо этого исключительные ситуации просто устанавливают внутренний флаг, который можно проверить с помощью метода checkError..."

Подводя итог, это удобно для генерации текстового вывода, привитого поверх ввода-вывода более низкого уровня.

В Java 1.1 Reader, Writer а также PrintWriter были введены. Эти все поддерживают наборы символов. В то время как InputStream а также OutputStream все еще имел реальное использование (обработка необработанных данных), PrintStream стало гораздо менее актуальным, потому что печать от природы о тексте.

Javadoc для PrintWriter прямо заявляет:

В отличие от класса PrintStream, если включена автоматическая очистка, то это будет выполняться только при вызове одного из методов println(), а не всякий раз, когда выводится символ новой строки. Методы println() используют собственное представление платформы о разделителе строк, а не символ новой строки.

Другими словами, PrintWriter следует использовать только через print*(...) API, потому что написание символов новой строки и т. Д. Не должно быть обязанностью вызывающего абонента, точно так же, как работа с кодировками файлов и наборами символов не входит в обязанности вызывающей стороны.

Я бы сказал, что PrintWriter должно было java.io.Printer а не продлили Writer, Я не знаю, распространялись ли они на мимику PrintStreamили потому что они застряли на поддержании идиомы дизайна трубы.

Причиной, по которой это было не то же самое в начале, был, вероятно, просто несчастный случай Теперь это обратная совместимость.

Другие вопросы по тегам