2011-11-05 48 views
2

我發現我的困惑,下面的代碼片段:爲什麼打印' 0'會使Java的其餘部分無效?

void print() { 
    System.out.print("!"); 
    System.out.print("!\0"); 
    System.out.flush(); // This line does not affect the outcome 
    System.out.println("!"); 
    System.out.println("!"); 
} 

將只打印出來:

!! 
! 

我搜索了實施開放JDK的源代碼,但無濟於事。

唯一的線索有線索似乎BufferedOutputStream,它似乎也有類似的「終止在\ u0000」行爲。

另外我找不到任何關於這個意外(對我來說)行爲的文檔。

編輯:我的環境:

java version "1.6.0_22" 
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

IDE: Eclipse Indigo 3.7.0 

再次編輯:在命令行中,該代碼按預期工作(四個S 「!」)。所以它似乎是Ubuntu下的Eclipse 3.7.0 Indigo的一個bug?最終編輯:看起來不可信和amir75說,這不是Java的怪癖:我將Eclipse的輸出重定向到一個文件,如果我在Eclipse中打開它,僅僅是內容有三個「!」;但是從命令行使用cat時,有四個。另外,vi和emacs在第一行顯示!!^@!,這和預期一致。謝謝你們!

有人可以對此有所瞭解嗎?這是Java Spec中的任何地方需要的嗎?感謝您的任何意見!

+4

無法重現。按照預期,以下內容將打印4'!':http://ideone.com/HrKZE –

+0

您使用的是哪個版本的JDK? –

+1

@Matt Ball:我用我的環境信息更新了帖子。這是一個特定於實現的東西,還是OpenJDK/Eclipse中的一個錯誤?謝謝! –

回答

3

這是與終端相關的:我剛剛在Eclipse中嘗試過,它重現了您的錯誤。在命令行上,它沒有。

我認爲這是可以預期的,因爲大多數語言自C使用內部的\0(空字節)來表示字符串的結尾。

感謝已故的丹尼斯里奇,這就是東西的工作原理。

2

Java可能無法控制行爲 - 控制檯決定如何解釋字節。控制檯不總是按原樣打印;一些字節甚至可能導致顏色變化或發出嗶嗶聲。

相關問題