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