Java PrintWriter自动刷新疑难逻辑

Java PrintWriter自动刷新疑难逻辑,java,io,printwriter,printstream,autoflush,Java,Io,Printwriter,Printstream,Autoflush,: : 在这些类之间更改自动刷新逻辑的原因是什么? 因为它们总是被认为是相同的,除了编码时刻和在print()上不刷新的“autoflush”(几乎不符合最小惊讶的原则,所以会出现愚蠢的错误: 开始时不一样的原因可能只是一次事故。现在是向后兼容性。我认为答案在于Java的历史。java.io中的三个InputStream、OutputStream和PrintStream可以追溯到Java1.0。这是在语言中构建了对文件编码和字符集的严格支持之前 引用Javadoc: “PrintStream将功

:

:

在这些类之间更改自动刷新逻辑的原因是什么? 因为它们总是被认为是相同的,除了编码时刻和在
print()上不刷新的“autoflush”(
几乎不符合最小惊讶的原则,所以会出现愚蠢的错误:

开始时不一样的原因可能只是一次事故。现在是向后兼容性。

我认为答案在于Java的历史。
java.io
中的三个
InputStream
OutputStream
PrintStream
可以追溯到Java1.0。这是在语言中构建了对文件编码和字符集的严格支持之前

引用Javadoc:

“PrintStream将功能添加到 另一个输出流,即 能够打印图形的表示形式 各种数据值方便 还提供了其他功能。 与其他输出流不同 PrintStream从不抛出 IOException;相反,是Exception 情况只是设置了一个内部标志 这可以通过checkError进行测试 方法……”

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

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

PrintWriter
的Javadoc明确声明:

与PrintStream类不同,如果 启用自动冲洗后,它将 仅当其中一个println() 方法被调用,而不是 每当换行符出现时 被输出。println()方法 使用平台自己的线路概念 分隔符而不是换行符 性格

换句话说,PrintWriter只能通过
print*(…)
API使用,因为编写换行符等不应由调用方负责,处理文件编码和字符集的方法也不应由调用方负责


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

欢迎来到现实世界。希望你喜欢,再见。开个玩笑当然,我不能确定,但还有什么?谢谢你,逻辑有点清楚了。但是我应该提到的是,我们在使用socket API时遇到了一个问题,RFC文档中指定了“\r\n”行分隔符,因此
println()
是不可接受的。如果RFC关心行结尾等,那么您需要处理InputStreams和OutputStreams。使用PrintStreams或PrintWriter实现套接字级RFC是危险的。然而,RFC仍然可以采用UTF或类似的字符编码。如果是这样,您应该逐行使用诸如String.getBytes(…)和CharsetEncoder之类的API,但仍然可以在不“打印”抽象的情况下管理流。
out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods
will flush the output buffer
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