2014-04-06 78 views
6

我運行這段代碼和的Java打印字符數組

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
System.out.print(str); 
System.out.println(" adksjfhak"); 

這只是打印 「ABC」。 同時,

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
System.out.print(str); 
System.out.println("\n adksjfhak"); 

打印

abc 
adksjfhak 

爲什麼打印緩衝區停在零(0)字符?這是否意味着Java只是將字符添加到緩衝區並打印該緩衝區?當然,由於該緩衝區之間有0,因此會丟棄該字符串的其餘部分。

也許我已經回答了我自己的問題的一部分。但我想知道更多關於這方面的細節。 Hows JVM如何處理?這個輸出緩衝區在哪裏?任何理由停止在0?爲什麼加入\ n會停止這種行爲?

編輯1:使用JDK 1.7時,Eclipse 3.8.1和Ubuntu 13.10

編輯2:奇怪的是,這一個不存在這樣的問題。 https://ideone.com/VwFbRr

編輯3:我跑的命令行相同

[bin]$ java com.sakura.C 
abcccf adksjfhak 
+0

這對我來說很好(JDK 1.7) – Christian

+0

@Christian你的意思是在第一種情況下,你會同時獲得abc和adksjfhak嗎? – sakura

+1

分別,它打印出'ABC CCF adksjfhak'和'ABC CCF \ n adksjfhak'我。我不確定問題是什麼。 – Matthew

回答

0

最有可能的,這一切是越來越「打印」操作系統在這兩種情況下,但在第一種情況下,你的操作系統或shell將'0'字符作爲不顯示行的其餘部分的信號。在第一種情況下,兩個字符串都顯示在同一行上,因此第二個字符串也被抑制。在第二種情況下,第二個字符串位於新行上,因此顯示。

+0

您是否嘗試過運行代碼?如果有的話,終端模擬器可能會出現問題,但由於OP在Eclipse中運行,這不太可能。就像其他人,包括我是誰。我嘗試了沒能重現該問題 - 它只是打印「abcccf」在這兩種情況下,不顯示爲0字符的任何輸出。 –

+0

是的,看起來像linux在這裏做的事情。任何參考,任何人? – sakura

+0

@ErwinBolwidt的0字符不是可打印字符,因此預計不會顯示。 –

3

您看到的行爲不能通過查看Java代碼來解釋。相反,我懷疑這與你用來查看輸出的東西有關。

第一本:

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
    System.out.print(str); 

按照PrintWriter的javadoc的,

System.out.print(str); 

將相當於調用

System.out.print(str[i]); 

每個字符。 (是每一個,包括零字符!)。而write(char)的行爲只是按照默認的平臺編碼對字符進行編碼,然後編寫它。對於零字符(代碼點零)和典型的7或8位字符集,即將寫入NUL字符。

在Java方面沒有時髦的「字符串結尾的零」方法,它使用標準Java I/O類的標準Java字符串。期。

我能想到的3條可能的解釋:

  1. 你就錯了。你的實際代碼寫了一些不同的東西。 (例如,如果您正在從命令行進行測試,則可能忘記重新編譯...。)

  2. 您看到的奇怪行爲正在發生,因爲您使用的控制檯和/或您用來顯示輸出的實用程序正在用NUL字符做一些「特殊」的事情。 (不過,我不記得控制檯的聽證會,在這個奇怪的方式來處理NUL等程序...)

  3. 您的應用程序創造了PrintWriter自定義子類型,實現了零碼點一些特殊的處理,它已使用System.setOut(...)通過該類重定向輸出。


話雖如此,它可能是一個壞主意,嘗試打印包含零/ NULL字符的字符串或字符數組。 NUL字符是一個「控制代碼」,通常被歸類爲不可打印。當你嘗試打印它時你會看到......是不可預測的。

如果您想進一步追究這個問題,我建議你重定向嫌疑輸出到一個文件,然後使用一些(OS特定的)工具來查看文件的字節;例如在Unix/Linux系統上的od。我希望看到文件中的零字節...

+0

我認爲這應該是2。這只是一個獨立的單人班。但我使用JDK 1.7,Eclipse 3.8.1和Ubuntu 13.10,這是很常見的設置。另外我還沒有對JVM設置做任何事情,或者對Linux做任何改變。 – sakura