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
или потому что они застряли на поддержании идиомы дизайна трубы.
Причиной, по которой это было не то же самое в начале, был, вероятно, просто несчастный случай Теперь это обратная совместимость.