写方法的奇怪行为

时间:2013-12-27 07:07:56

标签: java

我正在寻找一些PrintStream类的方法并遇到write()并且根据要在控制台中打印的文档,我们需要调用System.out.flush();。但我怀疑的是我是否写了这些行

System.out.write(40);
System.out.write(10);

然后(也会打印出来。我知道10代表新行,但我想知道为什么只有新行才会发生。如果我写了

 System.out.write(40);
 System.out.write(32); 32 for space then also nothing gets printed.

Demonstration

4 个答案:

答案 0 :(得分:5)

来自PrintStream.write

if ((b == '\n') && autoFlush)
   out.flush();
}

因此,如果您向System.out写一个新行,它将自动刷新。 Btw javadoc也这么说:

  

将指定的字节写入此流。如果该字节是换行符并且启用了自动刷新,则将调用flush方法。

答案 1 :(得分:1)

输出流可能是行缓冲的 - 也就是说,它会在看到行尾时自动刷新。为了保证你的输出,你应该总是使用flush()。

答案 2 :(得分:1)

这似乎是PrintStream中的竞争条件。只要写入的输出包含字符OutputStreamThe (OpenJDK 6) PrintStream code强制刷新底层\n,而不是任何其他时间,并且没有任何类型的终结器确保{{{}中的缓冲输出当JVM退出时,JVM包装标准输出会被刷新。

The code that initializes the System class使用一个128字节的缓冲区用于BufferedOutputStream,如果输出足够的字符来填充缓冲区(我在写{{1}时插入了128个计数System.out循环你会在终端上看到输出。

答案 3 :(得分:1)

来自docs

public void write(int b)

Writes the specified byte to this stream. If the byte is a newline and automatic 
flushing is enabled then the flush method will be invoked.