Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中打印“\0”会使该行的其余部分无效?_Java_String_Stream_Io - Fatal编程技术网

为什么在Java中打印“\0”会使该行的其余部分无效?

为什么在Java中打印“\0”会使该行的其余部分无效?,java,string,stream,io,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("!"); } 将仅打印出: !! ! 我在OpenJDK的源代码中搜索了实现,但没有结果 唯一

我困惑地发现以下片段:

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("!");
}
将仅打印出:

!!
!
我在OpenJDK的源代码中搜索了实现,但没有结果

唯一的线索是它似乎是BufferedOutputStream,而且它似乎也有类似的terminate on \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下Eclipse3.7.0Indigo的一个bug

应该是最终编辑:正如不可更改和amir75所说,这不是Java的一个怪癖:我将Eclipse的输出重定向到一个文件,如果我在Eclipse中打开它,内容只有三个!s但是当从命令行使用cat时,有四种方法。此外,vi和emacs都显示!!^@!对于第一行,正如预期的那样。谢谢大家!


有人能解释一下吗?Java规范中的任何地方都需要这样做吗?谢谢你的意见

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

这取决于终端:我刚刚在Eclipse中尝试过,它再现了您的错误。在命令行上,它没有

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


多亏了已故的、伟大的丹尼斯·里奇(Dennis Ritchie),东西就是这样运作的。

无法复制。下面是4张照片!s、 正如所料:你使用的是什么版本的JDK?@Matt Ball:我已经用我的环境信息更新了帖子。这是一个特定于实现的东西,还是OpenJDK/Eclipse中的一个bug?谢谢您是在IDE中运行,还是从命令行运行?它在OSX10.6上的EclipseIndigo中也适用。