PrintWriter - автоматическая головоломка - PullRequest
0 голосов
/ 31 марта 2011

public PrintWriter (OutputStream out, boolean 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, boolean 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 ]

2 голосов
/ 01 апреля 2011

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

0 голосов
/ 31 марта 2011

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

...