Java打印字符数组

6

我正在运行这段代码

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,因此它会丢弃字符串的其余部分。
也许我已经回答了自己问题的一部分。但我想更详细地了解这个问题。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

这对我来说很好用(JDK 1.7) - Christian Tapia
1
分别打印出了abc ccf adksjfhakabc ccf\n adksjfhak,我不确定问题在哪里。 - Mdev
1
@sakura 我得到了 "abcccf adksjfhak" - Christian Tapia
无法复制您的结果 http://bit.ly/1idejXO - Ari
1
有人尝试过使用Linux吗? - sakura
显示剩余3条评论
2个回答

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]);

对于每个字符(是的,每个字符,包括0字符!),write(char)方法会根据默认平台编码进行字符编码,并将其写入。对于一个零字符(码点为0)和一个典型的7或8位字符集,这将写入NUL字符。
在Java字符串和Java I/O类的标准情况下,没有任何奇怪的“零表示字符串结尾”的东西。这就是事实。
我能想到三种可能的解释:
1. 您弄错了,您实际的代码正在写入不同的内容。(例如,如果您从命令行进行测试,您可能忘记了重新编译...) 2. 您看到的奇怪行为是因为您的控制台和/或用于显示输出的实用程序正在对NUL字符执行某些“特殊”操作。(但是,我不记得听说过处理NUL的控制台等程序以这种奇怪的方式...) 3. 您的应用程序创建了打印子类型的自定义子类型,并且实现了一些特殊处理代码点零的功能,并使用System.setOut(...)通过该类重定向了输出。
话虽如此,尝试打印包含零/NUL字符的字符串或字符数组可能是一个坏主意。 NUL字符是一个“控制码”,通常被归类为不可打印。 尝试打印它时,您将看到...是不可预测的。
如果您想进一步追究此问题,我建议将可疑的输出重定向到文件,然后使用一些(特定于操作系统的)实用程序查看文件的字节;例如,在Unix / Linux系统上使用od。 我希望在该文件中看到零字节。

我认为这里应该是2。它只是一个独立的单类。但我正在使用JDK 1.7,Eclipse 3.8.1和Ubuntu 13.10,这是相当常见的设置。此外,我没有对JVM设置或Linux进行任何更改。 - sakura

0
很可能,在这两种情况下,所有内容都被“打印”到操作系统中,但在第一种情况下,您的操作系统或shell将'0'字符视为不显示该行其余部分的信号。在第一种情况下,两个字符串出现在同一行,因此第二个字符串也被抑制了。在第二种情况下,第二个字符串位于新行上,因此会被显示。

你尝试过运行代码吗?如果有什么问题,终端仿真器可能会出现问题,但由于OP正在Eclipse中运行,这不太可能发生。就像其他人和我一样尝试过,但无法重现该问题-在两种情况下都只打印“abcccf”,不显示任何0字符的输出。 - Erwin Bolwidt
是的,看起来Linux在这里做了一些事情。有任何参考资料吗? - sakura
@ErwinBolwidt 0 字符不是可打印字符,因此不应该显示。 - Warren Dew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接