何时/为什么要在Java中调用System.out.flush()

为什么某些stream需要刷新( FileOutputStream和来自套接字的stream),而标准输出stream不是?

每当有人使用System.out PrintStream对象时,无论是调用println()还是write() ,都不会刷新stream。 但是,其他程序员习惯性地使用其他stream调用flush() PrintStream / PrintWriter

我最近问这个问题给几个程序员,有些人认为在Java中有一些后台处理来自动刷新System.outstream,但我找不到任何文档。

像这样的东西让我怀疑是否只是调用System.out.println()是平台无关的,因为一些系统可能需要你刷新stream。

System.out基于PrintStream ,默认情况下每当写入换行符时都会刷新。

从javadoc :

autoFlush – 一个布尔值; 如果为true,则每当写入一个字节数组时,都会刷新输出缓冲区,调用其中一个println方法,或者写入换行符或字节( '\n'

因此,您提到的println情况是明确处理的,并且write byte[]也保证被刷新,因为它落在“每当一个字节数组被写入”时。

如果使用System.setOutreplaceSystem.out并且不使用自动填充stream,那么您将不得不像其他任何stream一样使用自动填充stream。

库代码可能不应该直接使用System.out ,但是如果是这样,那么它应该小心刷新,因为库用户可能会重写System.out以使用非刷新stream。

任何将二进制输出写入System.out Java程序在exit之前应该小心flush ,因为二进制输出通常不包含尾随的换行符。

PrintStream文档 :

可选地,可以创buildPrintStream以便自动刷新; 这意味着在写入一个字节数组之后, flush方法被自动调用, println方法之一被调用,或者一个换行字符或者字节( '\n' )被写入。

虽然我没有看到它在文档中明确提到,但我的理解是System.out将执行此自动刷新。

当您不能等待显示项目时,请刷新stream。

当JVM发生故障时,不要刷新stream,否则会丢失显示缓冲区中的项目,这可能会使您明智的错误信息告诉您为什么JVM停机失败。 这使得debugging变得更加困难,因为人们往往会说,“但是它并没有到达这里,因为它会打印出来”。

System.out默认是行缓冲的。 所以,如果你打电话给println而不print它应该不成问题。 看到这篇文章的更多信息。