PrintStream
和之间有什么区别PrintWriter
?由于我经常将这两个类混在一起,因此它们有许多共同的方法。而且,我认为我们可以将它们用于完全相同的事物。但是必须有所不同,否则,只有一个阶级。
我搜索了档案,但找不到此问题。
PrintStream
和之间有什么区别PrintWriter
?由于我经常将这两个类混在一起,因此它们有许多共同的方法。而且,我认为我们可以将它们用于完全相同的事物。但是必须有所不同,否则,只有一个阶级。
我搜索了档案,但找不到此问题。
Answers:
听起来可能有些轻率,但PrintStream
打印到OutputStream
,然后PrintWriter
打印到Writer
。好的,我怀疑我会说出明显的观点是否有任何意义。但是还有更多。
那么,an OutputStream
和a有Writer
什么区别?两者都是流,主要区别是a OutputStream
是字节流,而a Writer
是字符流。
如果OutputStream
处理字节,那又如何PrintStream.print(String)
呢?它将使用默认平台编码将字符转换为字节。使用默认编码通常是一件坏事,因为从一个平台迁移到另一个平台时,它可能导致错误,尤其是在一个平台上生成文件并在另一个平台上使用该文件时。
使用Writer
,您通常可以指定要使用的编码,避免任何平台依赖性。
为什么PrintStream
在JDK中麻烦一个,因为主要目的是写字符而不是字节?PrintStream
引入Reader / Writer字符流时,它早于JDK 1.1。我以为Sun PrintStream
仅会因为它被如此广泛地使用而弃用了。(毕竟,你不希望每次调用System.out
生成一个过时的API的警告!另外,从变更类型PrintStream
,以PrintWriter
在标准输出流将会破坏现有的应用程序。)
PrintStream
不限于使用平台默认编码。有些构造函数接受一个字符集名称。因此,PrintStream
和之间的区别PrintWriter
是a PrintWriter
不能写原始字节,而这两个类包装了不同类型的目的地。
PrintStream
的print()
方法,但便捷函数调用write()
,因此,如果启用,它们将触发自动刷新。PrintWriter
另一方面,在呼叫至之后,将不会自动冲洗print()
。我今天在向一些初学者展示Java,这吸引了一些不熟悉手动冲洗的学生。否则,您的答案就很好。
使用,PrintStream
您将无法使用平台的默认编码。
PrintStream stream = new PrintStream(output);
PrintWriter
不过,您可以通过传递OutputStreamWriter
带有特定编码的。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
这样做的好处是,您可以控制编码字符的字符,以使字符最终不会成为mojibake。
PrintStream(OutputStream out, boolean autoFlush, String encoding)
诸如PrintWriter之类的编写器用于文本输出,而流则用于二进制输出。作家为您处理字符集内容。流不是因为假设您不想要这种转换,否则将使您的二进制数据混乱,并且如果这样做的话,将使用写入器。
您可以将原始字节写入流,而不能写入写入器。该PrintWriter的 javadoc中列出了其他方面的差异(最重要的是,能够设置一个流上的编码,因此它可以解释原始字节我会说)。
来自Horstmann的Java核心
Java资深人士可能会想知道PrintStream类和System.out发生了什么。在Java 1.0中,PrintStream类通过删除最高字节将所有Unicode字符截断为ASCII字符。(当时Unicode仍然是16位编码。)显然,这不是一种干净或可移植的方法,并且随着Java 1.1中读写器的引入而得以解决。为了与现有代码兼容,System.in,System.out和System.err仍是输入/输出流,而不是读取器和写入器。但是现在,PrintStream类在内部将Unicode字符转换为默认的主机编码,方法与PrintWriter相同。当您使用print和println方法时,类型为PrintStream的对象的行为与打印作者完全相同,