2009-01-12 48 views
3

我在Sun的命令行I/O上查看了this教程。它指出:为什么在Java中将System.out/err实现为Byte Streams?

你可能期望的标准流 是字符流,但是,对于 历史的原因,他们是字节 流。 System.out和System.err是定义为PrintStream对象的 。 尽管它在技术上是一个字节 流,但PrintStream利用内部字符流对象 来模拟 字符流的许多功能。

有没有人知道“历史原因”是什么?

回答

6

“历史原因”是字符流在Java 1.0中不存在。显然,Sun意识到角色翻译模型是不够的,并且在Java 1.1中添加了面向角色的Reader/Writer类层次结构。

但是对于System.out和朋友来说已经太晚了。

0

我猜测原因是与POSIX C/C++标准I/O向后兼容,其中stdin,stdout和stderr(C/C++等效于System.in,System.out和System.err)是字节流。在Windows中,这些流执行CRLF转换,但在POSIX系统中,不会发生此类转换,并且可以自由读取和写入非字符二进制数据。许多Unix实用程序都这样做,例如GNU的gziptar

+0

CRLF翻译?你能解释一下这意味着什么吗?谢谢:) – hhafez 2009-01-12 04:13:27

0

请记住,Java中的字符使用16位Unicode字符。原始的System.in等需要与支持Java的环境兼容,其中(当时在黎明的时候)经常没有支持Unicode的。这与行结束的恼人的不同处理一样,意味着无论什么平台,字节流都是唯一具有相同语义的类型。

相关问题