Java: PrintStream 与 PrintWriter 的区别

PrintStreamPrintWriter有什么不同?它们有许多共同的方法,因此我经常将这两个类混合在一起。而且,我认为我们可以用它们来做完全相同的事情。但是必须有区别,否则,只会有一个类。

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

66712 次浏览

这可能听起来轻率,但是 PrintStream打印到 OutputStream,而 PrintWriter打印到 Writer。好吧,我怀疑我会得到任何点,陈述显而易见的。但还有更多。

那么,OutputStreamWriter有什么区别呢? 两者都是流,主要区别是 OutputStream是字节流,而 Writer是字符流。

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

使用 Writer时,通常需要指定要使用的编码,从而避免任何平台依赖性。

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

像 PrintWriter 这样的编写器用于文本输出,流用于二进制输出。编剧为你处理角色设置的事情。流不会这样做,因为它假定您不希望进行这种转换,而这种转换会弄乱您的二进制数据,并且如果您希望这样做,它将使用编写器。

您可以将原始字节写入记录流,而不是写入 Writer。打印机 javadoc 列出了其他差异(最重要的是,能够在流上设置编码,这样它就可以解释我要说的原始字节)。

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

打印机是打印流的增强。

即特定用途的打印流。

核心咖啡霍斯特曼

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 的行为与打印作者完全相同,但不同于 Print writer 允许您使用 write (int)和 write (byte [])方法输出原始字节。