我发现了以下片段:
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中是否需要?感谢您的任何投入!
答案 0 :(得分:3)
这是终端依赖的:我刚刚在Eclipse中尝试过,它重现了你的错误。在命令行上,它没有。
我认为这是可以预料到的,因为C以来的大多数语言都在内部使用\0
(空字节)来表示String的结束。
感谢已故的伟大的丹尼斯·里奇,这就是它的运作方式。
答案 1 :(得分:2)
Java可能无法控制行为 - 控制台决定如何解释字节。控制台并不总是按原样打印;某些字节甚至可能导致颜色变化或发出哔哔声。