System.out 是一个 PrintStream 对象。我阅读了有关 PrintStream 的文档。我不明白为什么 System.out.print 会导致缓冲区被刷新?那不应该只发生在println吗?
3 回答
那不应该只发生在println吗?
Javadoc 没有说明何时不会刷新。它说它将在aprintln()
或 newline上刷新。
冒着重复已经注意到的事实的风险,让我试着用不同的方式解释文档......
似乎只有在 PrintBuffer创建时(即在构造函数调用期间)才能设置 PrintStream 的 autoFlush 行为。
此外,正如您所指出的,文档指出,在调用任何各种公共 PrintBuffer 构造函数时,不指定自动刷新状态将导致创建非自动刷新的 PrintStream。
但是,在 System.out 的情况下,您不会调用 PrintBuffer 的构造函数。java.lang.System 类在 VM 启动时实例化“out”PrintStream。这意味着,当您请求 System object 存储在其“out”字段中的 PrintStream 对象时,您不知道调用了哪个构造函数,因此不知道当您询问时传递给您的流的自动刷新状态为了它。
我同意,如果 java.lang.System 的文档指定包含在其“out”字段中的流将其自动刷新行为设置为 true,那就太好了。但这不是“要求”,就像我需要记录从我的(假设的)myCrazyPanel.getTheChangeColorsButton() 返回的 JButton 是启用还是禁用一样。是的,按钮默认是启用的,但是如果 JButton 被禁用,你就不能抱怨。这里也一样。
您希望在调用 System.out.print() 时刷新缓冲区,因为您希望它被打印。当我调用 print 时,我希望它打印一些东西。如果它没有刷新,它只会留在缓冲区中,我什么也看不到。
在这里检查冲洗。
基本上这是保证它会立即被打印出来。