为什么FileOutputStream标准输出流不需要刷新某些流(以及来自套接字的流)?
每当有人使用System.out PrintStream对象,是它,而调用println()或者write(),他们从来不冲洗流.然而,其他程序员习惯性地叫flush()一PrintStream/ PrintWriter与其他流.
我最近向几个程序员提出了这个问题,有些人认为在Java中有一些后台处理来自动刷新System.out流,但我找不到任何相关的文档.
这样的事情让我想知道简单地调用System.out.println()是否与平台无关,因为某些系统可能需要您刷新流.
Mik*_*uel 52
System.out基于a PrintStream,默认情况下,只要写入换行符就会刷新.
来自javadoc:
autoFlush - 布尔值; 如果为true,则只要写入字节数组,
println调用其中一个方法,或者'\n'写入换行符或byte(),就会刷新输出缓冲区
所以println你提到的情况是明确处理的,并且a的write情况byte[]也保证刷新,因为它落在"每当写入一个字节数组"时.
如果替换System.out使用System.setOut并且不使用autoflushing流,则必须像其他任何流一样刷新它.
库代码可能不应该System.out直接使用,但如果确实如此,那么应该小心刷新,因为库用户可能会覆盖System.out使用非刷新流.
二进制输出写入任何Java程序System.out应谨慎flush前exit因为二进制输出通常不包括换行符.
可选地,
PrintStream可以创建a以便自动刷新; 这意味着在flush写入字节数组,println调用其中一个方法或'\n'写入换行符或byte()之后,将自动调用该方法.
虽然我没有在文档中明确提到它,但我的理解是System.out将执行此自动刷新.
当您无法等待项目显示时,刷新流。
当 JVM 出现故障时,不刷新流可能会导致项目在显示缓冲区中丢失,这可能会使告诉您 JVM 故障原因的合理错误消息永远丢失。这使得调试变得更加困难,因为人们往往会说,“但它没有到达这里,因为它会打印这个”。