2014-04-06 77 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