2011-11-05 93 views
2

我发现我的困惑,下面的代码片段:为什么打印' 0'会使Java的其余部分无效?

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("!"); 
} 

将只打印出来:

!! 
! 

我搜索了实施开放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 

再次编辑:在命令行中,该代码按预期工作(四个S “!”)。所以它似乎是Ubuntu下的Eclipse 3.7.0 Indigo的一个bug?最终编辑:看起来不可信和amir75说,这不是Java的怪癖:我将Eclipse的输出重定向到一个文件,如果我在Eclipse中打开它,仅仅是内容有三个“!”;但是从命令行使用cat时,有四个。另外,vi和emacs在第一行显示!!^@!,这和预期一致。谢谢你们!

有人可以对此有所了解吗?这是Java Spec中的任何地方需要的吗?感谢您的任何意见!

+4

无法重现。按照预期,以下内容将打印4'!':http://ideone.com/HrKZE –

+0

您使用的是哪个版本的JDK? –

+1

@Matt Ball:我用我的环境信息更新了帖子。这是一个特定于实现的东西,还是OpenJDK/Eclipse中的一个错误?谢谢! –

回答

3

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

我认为这是可以预期的,因为大多数语言自C使用内部的\0(空字节)来表示字符串的结尾。

感谢已故的丹尼斯里奇,这就是东西的工作原理。

2

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

相关问题