何时/为什么要在Java中调用System.out.flush()
为什么某些stream需要刷新( FileOutputStream
和来自套接字的stream),而标准输出stream不是?
每当有人使用System.out
PrintStream
对象时,无论是调用println()
还是write()
,都不会刷新stream。 但是,其他程序员习惯性地使用其他stream调用flush()
PrintStream
/ PrintWriter
。
我最近问这个问题给几个程序员,有些人认为在Java中有一些后台处理来自动刷新System.out
stream,但我找不到任何文档。
像这样的东西让我怀疑是否只是调用System.out.println()
是平台无关的,因为一些系统可能需要你刷新stream。
System.out
基于PrintStream
,默认情况下每当写入换行符时都会刷新。
从javadoc :
autoFlush – 一个布尔值; 如果为true,则每当写入一个字节数组时,都会刷新输出缓冲区,调用其中一个
println
方法,或者写入换行符或字节('\n'
)
因此,您提到的println
情况是明确处理的,并且write
byte[]
也保证被刷新,因为它落在“每当一个字节数组被写入”时。
如果使用System.setOut
replaceSystem.out
并且不使用自动填充stream,那么您将不得不像其他任何stream一样使用自动填充stream。
库代码可能不应该直接使用System.out
,但是如果是这样,那么它应该小心刷新,因为库用户可能会重写System.out
以使用非刷新stream。
任何将二进制输出写入System.out
Java程序在exit
之前应该小心flush
,因为二进制输出通常不包含尾随的换行符。
从PrintStream
文档 :
可选地,可以创build
PrintStream
以便自动刷新; 这意味着在写入一个字节数组之后,flush
方法被自动调用,println
方法之一被调用,或者一个换行字符或者字节('\n'
)被写入。
虽然我没有看到它在文档中明确提到,但我的理解是System.out
将执行此自动刷新。
当您不能等待显示项目时,请刷新stream。
当JVM发生故障时,不要刷新stream,否则会丢失显示缓冲区中的项目,这可能会使您明智的错误信息告诉您为什么JVM停机失败。 这使得debugging变得更加困难,因为人们往往会说,“但是它并没有到达这里,因为它会打印出来”。
System.out默认是行缓冲的。 所以,如果你打电话给println
而不print
它应该不成问题。 看到这篇文章的更多信息。