Почему System.out / err реализован как байтовые потоки в Java? - PullRequest
3 голосов
/ 12 января 2009

Я смотрел этот учебник по Sun в командной строке ввода / вывода. Он заявил, что:

Вы можете ожидать стандартных потоков быть символьными потоками, но для исторические причины, они байт потоки. System.out и System.err являются определяется как объекты PrintStream. Хотя технически это байт PrintStream использует поток внутренний объект потока символов для эмулировать многие функции символьные потоки.

Кто-нибудь знает, что такое "исторические причины"?

Ответы [ 3 ]

6 голосов
/ 12 января 2009

«Исторические причины» заключаются в том, что символьные потоки не существовали в Java 1.0. Очевидно, Sun осознал, что модель перевода символов недостаточна, и в Java 1.1 была добавлена ​​иерархия классов Reader / Writer, ориентированная на символы

Но было слишком поздно для System.out и его друзей.

0 голосов
/ 12 января 2009

Помните, что символы в Java используют 16-битный символ Unicode. Исходный файл System.in и т. Д. Должен был быть совместим со средами, поддерживающими Java, которые (тогда, на заре времени) часто не поддерживали Unicode. Это, наряду с досадно разрозненной обработкой концов строк, означало, что потоки байтов были единственным типом, который имел одинаковую семантику независимо от платформы.

0 голосов
/ 12 января 2009

Я бы предположил, что причина в обратной совместимости со стандартными операциями ввода-вывода POSIX C / C ++, в которых stdin, stdout и stderr (эквивалент C / C ++ для System.in, System.out и System). .err соответственно) - байтовые потоки. В Windows эти потоки выполняют преобразование CRLF, но в системах POSIX таких преобразований не происходит, и вы можете свободно читать и записывать не символьные двоичные данные. Многие утилиты Unix делают это, такие как GNU gzip и tar.

...