公共 PrintWriter(OutputStream 输出,布尔 autoFlush) http://download.oracle.com/javase/6/docs/api/java/io/PrintWriter.html#PrintWriter%28java.io.OutputStream,%20boolean%29:
out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods
will flush the output buffer
公共 PrintStream(OutputStream 输出,布尔 autoFlush) http://download.oracle.com/javase/6/docs/api/java/io/PrintStream.html#PrintStream%28java.io.OutputStream,%20boolean%29:
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;为什么不自动冲洗? https://stackoverflow.com/questions/1240968/i-created-a-printwriter-with-autoflush-on-why-isnt-it-autoflushing
我认为答案就在于 Java 的历史。三人组InputStream
, OutputStream
and PrintStream
in java.io
可以追溯到 Java 1.0。那是在该语言内置对文件编码和字符集的严格支持之前。
引用Javadoc:
“PrintStream 添加了功能
另一个输出流,即
打印表示的能力
方便地获取各种数据值。二
还提供其他功能。
与其他输出流不同,
PrintStream 永远不会抛出
IO异常;相反,例外
情况只是设置一个内部标志
可以通过 checkError 进行测试
方法...”
总而言之,它可以方便地生成文本输出,嫁接到较低级别的 IO 之上。
在Java 1.1中,Reader
, Writer
and PrintWriter
被介绍了。这些都支持字符集。尽管InputStream
and OutputStream
仍然有实际用途(原始数据处理),PrintStream
变得不那么重要了,因为印刷本质上是关于文本的。
Javadoc 的PrintWriter
明确指出:
与 PrintStream 类不同,如果
自动冲洗已启用,它将
仅当 println() 之一时才执行
方法被调用,而不是
每当出现换行符时
待输出。 println() 方法
使用平台自己的线路概念
分隔符而不是换行符
特点。
换句话说,PrintWriter 只能通过print*(...)
API,因为编写换行符等不应该是调用者的责任,同样处理文件编码和字符集的方式也不是调用者的责任。
我认为PrintWriter
本来应该java.io.Printer
相反,并且没有延长Writer
。我不知道他们是否延伸到模仿PrintStream
,或者因为他们坚持维护管道设计习惯。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)