我正在寻找一些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.
答案 0 :(得分:5)
来自PrintStream.write
:
if ((b == '\n') && autoFlush)
out.flush();
}
因此,如果您向System.out
写一个新行,它将自动刷新。
Btw javadoc也这么说:
将指定的字节写入此流。如果该字节是换行符并且启用了自动刷新,则将调用flush方法。
答案 1 :(得分:1)
输出流可能是行缓冲的 - 也就是说,它会在看到行尾时自动刷新。为了保证你的输出,你应该总是使用flush()。
答案 2 :(得分:1)
这似乎是PrintStream
中的竞争条件。只要写入的输出包含字符OutputStream
,The (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.