PrintWriter autoflush令人费解的逻辑

时间:2011-03-30 21:06:33

标签: java io printwriter printstream autoflush

public 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

public 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

在这些类之间更改autoflush逻辑的原因是什么?

因为它们总是被认为是相同的,除了编码时刻和“autoflush”而没有冲洗print()几乎不符合最不惊讶的原则,愚蠢的错误发生:
I created a PrintWriter with autoflush on; why isn't it autoflushing?

2 个答案:

答案 0 :(得分:2)

我认为答案在于Java的历史。 InputStream中的三重奏OutputStreamPrintStreamjava.io可以追溯到Java 1.0。那是在对文件编码和字符集的严格支持构建到语言之前。

引用Javadoc:

  

“PrintStream添加了功能   另一个输出流,即   打印表示的能力   各种数据值方便。二   还提供其他功能。   与其他输出流不同,a   PrintStream永远不会抛出   IOException异常;相反,特殊   情况只是设置内部标志   可以通过checkError进行测试   方法...“

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

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

PrintWriter的Javadoc明确指出:

  

与PrintStream类不同,如果   它会启用自动刷新   只有当其中一个println()时才能完成   调用方法,而不是   每当换行符出现时   要输出。 println()方法   使用平台自己的线性概念   分隔符而不是换行符   字符。

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

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

答案 1 :(得分:0)

起初不一样的原因可能只是一场意外。现在它是向后兼容的。