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”而没有冲洗print()
几乎不符合最不惊讶的原则,愚蠢的错误发生:
I created a PrintWriter with autoflush on; why isn't it autoflushing?
答案 0 :(得分:2)
我认为答案在于Java的历史。 InputStream
中的三重奏OutputStream
,PrintStream
和java.io
可以追溯到Java 1.0。那是在对文件编码和字符集的严格支持构建到语言之前。
引用Javadoc:
“PrintStream添加了功能 另一个输出流,即 打印表示的能力 各种数据值方便。二 还提供其他功能。 与其他输出流不同,a PrintStream永远不会抛出 IOException异常;相反,特殊 情况只是设置内部标志 可以通过checkError进行测试 方法...“
总而言之,它可以方便地生成文本输出,嫁接在较低级别的IO之上。
在Java 1.1中,引入了Reader
,Writer
和PrintWriter
。那些都支持字符集。虽然InputStream
和OutputStream
仍有实际用途(原始数据处理),但PrintStream
变得不那么相关,因为本质上的打印是关于文本的。
PrintWriter
的Javadoc明确指出:
与PrintStream类不同,如果 它会启用自动刷新 只有当其中一个println()时才能完成 调用方法,而不是 每当换行符出现时 要输出。 println()方法 使用平台自己的线性概念 分隔符而不是换行符 字符。
换句话说,PrintWriter只能通过print*(...)
API使用,因为编写换行符等不应该是调用者的责任,处理文件编码和字符集的方式与调用者的责任不同。 / p>
我认为PrintWriter
应该是java.io.Printer
,而不是Writer
。我不知道他们是否扩展到模仿PrintStream
,或者因为他们坚持维护管道设计的习惯用语。
答案 1 :(得分:0)
起初不一样的原因可能只是一场意外。现在它是向后兼容的。