为什么System.out / err在Java中实现为Byte Streams?

时间:2009-01-12 04:05:41

标签: java iostream

我正在使用命令行I / O查看Sun的this教程。它声明:

  

您可能会期待标准流   是字符流,但是,为   历史原因,他们是字节   流。 System.out和System.err是   定义为PrintStream对象。   虽然它在技术上是一个字节   stream,PrintStream使用了一个   内部字符流对象   模仿的许多功能   字符流。

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请记住,Java中的字符使用16位Unicode字符。原始的System.in等需要与支持Java的环境兼容,后者(当时的黎明时分)经常不支持Unicode。这与线端的令人讨厌的不同处理意味着字节流是唯一具有相同语义的类型,无论在什么平台上。