[英]Why are System.out/err implemented as Byte Streams in Java?
我在Sun的命令行I / O上看了一下這個教程。 它表示:
您可能希望標准流是字符流,但由於歷史原因,它們是字節流。 System.out和System.err定義為PrintStream對象。 雖然從技術上講它是字節流,但PrintStream利用內部字符流對象來模擬字符流的許多功能。
有誰知道“歷史原因”是什么?
“歷史原因”是Java 1.0中不存在字符流。 顯然,Sun意識到字符轉換模型不足,並且在Java 1.1中添加了面向字符的Reader / Writer類層次結構。
但是對於System.out和朋友來說已經太晚了。
我猜這個原因是與POSIX C / C ++標准I / O向后兼容,其中stdin,stdout和stderr(分別是System.in,System.out和System.err的C / C ++等價物) )是字節流。 在Windows中,這些流執行CRLF轉換,但在POSIX系統中,不會發生此類轉換,您可以自由地讀取和寫入非字符二進制數據。 很多Unix實用程序都這樣做,比如GNU的gzip
和tar
。
請記住,Java中的字符使用16位Unicode字符。 原始的System.in等需要與支持Java的環境兼容,后者(當時的黎明時分)通常不支持Unicode。 這與線端的令人討厭的不同處理一起意味着字節流是唯一具有相同語義的類型,無論在什么平台上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.