为什么打印'\ 0'会使Java中的其余部分无效?

时间:2011-11-05 01:18:35

标签: java string stream io

我发现了以下片段:

void print() {
    System.out.print("!");
    System.out.print("!\0");
    System.out.flush(); // This line does not affect the outcome
    System.out.println("!");
    System.out.println("!");
}

只打印出来:

!!
!

我搜索了Open JDK的实现源代码,但没有用。

唯一的线索是线索似乎BufferedOutputStream,它似乎也有类似的“终止于\ u0000”行为。

此外,我找不到任何关于这个非常意外(对我来说)行为的文档。

编辑:我的环境:

java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

IDE: Eclipse Indigo 3.7.0

再次编辑:在命令行下,此代码按预期工作(四个“!”)。所以它似乎是Ubuntu下Eclipse 3.7.0 Indigo的一个错误?

(应该是)最终编辑:似乎不可信和amir75说,这不是Java的一个怪癖:我将Eclipse的输出重定向到一个文件,如果我在Eclipse中打开它,内容只有三个“!”;但是当从命令行使用cat时,有四个。此外,vi和emacs都显示第一行!!^@!,这与预期一致。谢谢大家!

有人可以对此有所了解吗?这在Java Spec中是否需要?感谢您的任何投入!

2 个答案:

答案 0 :(得分:3)

这是终端依赖的:我刚刚在Eclipse中尝试过,它重现了你的错误。在命令行上,它没有。

我认为这是可以预料到的,因为C以来的大多数语言都在内部使用\0(空字节)来表示String的结束。

感谢已故的伟大的丹尼斯·里奇,这就是它的运作方式。

答案 1 :(得分:2)

Java可能无法控制行为 - 控制台决定如何解释字节。控制台并不总是按原样打印;某些字节甚至可能导致颜色变化或发出哔哔声。