我正在运行此代码并
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
答案 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种可能的解释:
你错了。你的实际代码是写不同的东西。 (例如,您可能忘记重新编译...如果您从命令行进行测试。)
您看到的奇怪行为正在发生,因为您用于显示输出的控制台和/或实用程序正在执行某些操作"特殊"有NUL字符。 (但是,我不记得听说过以这种奇怪的方式处理NUL的控制台等程序......)
您的应用程序创建了一个自定义子类型PrintWriter
,它实现了对代码点零的一些特殊处理,并且已使用System.setOut(...)
通过该类重定向输出。
话虽如此,尝试打印包含零/ NUL字符的字符串或字符数组可能是个坏主意。 NUL字符是"控制代码"并且通常被归类为不可打印。当你试图打印它时你会看到......是不可预测的。
如果你想进一步追求这个,我建议你将可疑输出重定向到一个文件,然后使用一些(OS特定的)实用程序来查看文件的字节;例如Unix / Linux系统上的od
。我希望看到文件中的零字节......
答案 1 :(得分:0)
最有可能的是,在这两种情况下,所有这些都被“打印”到操作系统,但在第一种情况下,您的操作系统或shell将“0”字符作为信号不显示其余部分。在第一种情况下,两个字符串都出现在同一行,因此第二个字符串也被抑制。在第二种情况下,第二个字符串在新行上,因此显示。