0

公共 PrintWriter(OutputStream out, boolean autoFlush)

out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods
will flush the output buffer

公共 PrintStream(OutputStream out, boolean autoFlush)

out - The output stream to which values and objects will be printed 
autoFlush - A boolean; if true, the output buffer will be flushed 
whenever a byte array is written, one of the println methods is invoked, 
or a newline character or byte ('\n') is written

在这些类之间更改自动刷新逻辑的原因是什么?

因为它们总是被认为是相同的,除了编码时刻和没有刷新的“自动刷新”print()几乎不符合最小惊讶原则,所以会出现一些愚蠢的错误:
我创建了一个开启自动刷新的 PrintWriter;为什么不自动刷新?

4

2 回答 2

2

我认为答案在于 Java 的历史。三重奏InputStreamOutputStream并且可以追溯到 Java 1.0 PrintStreamjava.io那是在语言中内置对文件编码和字符集的认真支持之前。

引用 Javadoc:

“PrintStream 向另一个输出流添加了功能,即能够方便地打印各种数据值的表示形式。还提供了另外两个功能。与其他输出流不同,PrintStream 从不抛出 IOException;相反,异常情况只是设置一个内部可以通过 checkError 方法测试的标志..."

总而言之,它可以方便地生成文本输出,移植到较低级别的 IO 之上。

在 Java 1.1 中,Reader引入了Writer和。PrintWriter这些都支持字符集。虽然InputStream并且OutputStream仍然具有实际用途(原始数据处理),但PrintStream变得不那么相关了,因为打印本质上是关于文本的。

JavadocPrintWriter明确指出:

与 PrintStream 类不同,如果启用了自动刷新,它将仅在调用 println() 方法之一时完成,而不是在碰巧输出换行符时完成。println() 方法使用平台自己的行分隔符概念,而不是换行符。

换句话说,PrintWriter 只能通过print*(...)API 使用,因为写入换行符等不应该是调用者的责任,同样处理文件编码和字符集的方式不是调用者的责任。

我认为PrintWriter应该是java.io.Printer,而不是扩展Writer. 我不知道他们是否扩展为模仿PrintStream,或者因为他们坚持维护管道设计成语。

于 2011-04-01T14:45:05.520 回答
0

开始时不一样的原因可能只是一个意外。现在它是向后兼容的。

于 2011-03-30T21:30:00.280 回答