130

PrintStream和 和有什么不一样PrintWriter?它们有许多共同的方法,因此我经常将这两个类混合在一起。此外,我认为我们可以将它们用于完全相同的事情。但必须有区别,否则,将只有一个类。

我已经搜索了档案,但找不到这个问题。

4

6 回答 6

134

这可能听起来很轻率,但会PrintStream打印到OutputStream, 并PrintWriter打印到Writer. 好的,我怀疑我会因为陈述显而易见的事情而得到任何积分。但还有更多。

OutputStream那么,an和 a 有什么区别Writer呢?两者都是流,主要区别在于 aOutputStream是字节流,而 aWriter是字符流。

如果 anOutputStream处理字节,那PrintStream.print(String)呢?它使用默认平台编码将字符转换为字节。使用默认编码通常是一件坏事,因为当从一个平台移动到另一个平台时,它可能会导致错误,尤其是当您在一个平台上生成文件并在另一个平台上使用它时。

使用 a Writer,您通常指定要使用的编码,避免任何平台依赖性。

PrintStream既然主要目的是写字符而不是字节,为什么还要在 JDK 中使用 a呢?PrintStream在引入 Reader/Writer 字符流时早于 JDK 1.1。PrintStream我想如果仅仅是因为它被广泛使用,Sun 就会弃用它。(毕竟,您不希望每次调用都System.out生成已弃用的 API 警告!此外,将标准输出流上的类型从 更改为PrintStreamPrintWriter破坏现有的应用程序。)

于 2010-05-12T19:18:19.053 回答
20

从 JDK 1.4 开始,可以为 PrintStream 指定字符编码。因此,PrintStream 和 PrintWriter 之间的区别仅在于自动刷新行为,并且 PrintStream 不能包装 Writer。

于 2011-01-23T20:22:04.007 回答
3

像 PrintWriter 这样的编写器用于文本输出,流用于二进制输出。作者为您处理字符集。流不这样做是因为假设您不想要那种转换,这会弄乱您的二进制数据,并且如果您这样做了就会使用编写器。

于 2010-05-12T19:20:27.707 回答
2

您可以将原始字节写入 Stream 而不是写入器。PrintWriter javadoc 列出了其他差异(最重要的是,能够在流上设置编码,以便它可以解释我所说的原始字节)。

于 2010-05-12T19:23:43.770 回答
2

来自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 类型的对象的行为与打印编写器完全相同,

于 2019-08-11T11:29:06.940 回答
-3

Printwriter 是对 printstream 的增强。

用于特定目的的 IE 打印流。

于 2016-12-09T22:22:16.440 回答