【问题标题】:java printing char arrayjava打印字符数组
【发布时间】:2014-05-18 07:57:08
【问题描述】:

我正在运行这段代码并且

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 你的意思是在第一种情况下,你得到 abc 和 adksjfhak 吗?
  • 分别为我打印出abc ccf adksjfhak 和abc ccf\n adksjfhak。我不确定是什么问题。
  • @sakura 我得到"abcccf adksjfhak"。
  • 有人尝试过使用 Linux 吗?

标签: java char system.out


【解决方案1】:

您所看到的行为无法仅通过查看 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 I/O 类的标准 Java 字符串中,Java 端没有时髦的“字符串结尾的零手段”。时期。

我能想到 3 种可能的解释:

  1. 你错了。您的实际代码正在编写不同的东西。 (例如,您可能忘记重新编译...如果您是从命令行进行测试。)

  2. 您看到的奇怪行为正在发生,因为您的控制台和/或用于显示输出的实用程序正在使用 NUL 字符执行“特殊”操作。 (但是,我不记得听说过以这种奇怪方式处理 NUL 的控制台等程序......)

  3. 您的应用程序创建了PrintWriter 的自定义子类型,该子类型实现了对代码点零的一些特殊处理,并使用System.setOut(...) 通过该类重定向输出。


话虽如此,尝试打印包含零/NUL 字符的字符串或字符数组可能是个坏主意。 NUL 字符是“控制代码”,通常被归类为不可打印。当您尝试打印它时,您会看到......无法预测。

如果您想进一步研究,我建议您将可疑输出重定向到文件,然后使用某些(特定于操作系统的)实用程序查看文件的字节;例如od 在 Unix / Linux 系统上。我希望在文件中看到零字节...

【讨论】:

  • 我觉得这里应该是2。它只是一个独立的、单一的类。但我使用的是 JDK 1.7、Eclipse 3.8.1 和 Ubuntu 13.10,这是很常见的设置。我也没有对 JVM 设置做任何事情,或者对 Linux 做任何改变。
【解决方案2】:

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

【讨论】:

  • 你试过运行代码吗?如果有的话,终端仿真器可能有问题,但由于 OP 在 Eclipse 中运行,这不太可能。就像包括我在内的其他人尝试过但无法重现该问题一样 - 在这两种情况下都只是打印“abcccf”,而不显示 0 字符的任何输出。
  • 是的,看起来 linux 正在这里做点什么。任何参考,有人吗?
  • @ErwinBolwidt 0 字符不是可打印字符,因此不会显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2015-06-28
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多