java打印char数组

时间:2014-04-06 02:26:46

标签: java char system.out

我正在运行此代码并

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

为什么打印缓冲区停止为null(0)字符?这是否意味着Java只是保持追加字符缓冲并打印缓冲区?当然,由于缓冲区之间的缓冲区为0,因此会丢弃其余的字符串。

可能我已回答了部分问题。但我想知道更多关于此的细节。 HOW 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

2 个答案:

答案 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(...)通过该类重定向输出。

    < / LI>

    话虽如此,尝试打印包含零/ NUL字符的字符串或字符数组可能是个坏主意。 NUL字符是&#34;控制代码&#34;并且通常被归类为不可打印。当你试图打印它时你会看到......是不可预测的。

    如果你想进一步追求这个,我建议你将可疑输出重定向到一个文件,然后使用一些(OS特定的)实用程序来查看文件的字节;例如Unix / Linux系统上的od。我希望看到文件中的零字节......

答案 1 :(得分:0)

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