Java:PrintStream和PrintWriter之间的区别

时间:2010-05-12 19:14:40

标签: java io printwriter printstream

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

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

7 个答案:

答案 0 :(得分:124)

这可能听起来很轻浮,但PrintStream打印到OutputStreamPrintWriter打印到Writer。好吧,我怀疑我会说明显而易见的任何要点。但还有更多。

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

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

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

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

答案 1 :(得分:61)

使用PrintStream,您会遇到平台的默认编码。

PrintStream stream = new PrintStream(output);

使用PrintWriter,您可以传递具有特定编码的OutputStreamWriter

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

优点是,您可以控制字符编码,应该写入字符,使它们最终不会以mojibake结尾。

答案 2 :(得分:17)

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

答案 3 :(得分:3)

PrintWriter等作者用于文本输出,流用于二进制输出。作者为你处理字符集的东西。流不是因为它假设您不希望那种转换,这会弄乱您的二进制数据,并且如果您这样做将会使用编写器。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

来自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的行为与打印编写器完全相同,但与   印刷作家,他们允许您使用write(int)和write(byte [])方法输出原始字节。

答案 6 :(得分:-2)

Printwriter是printstream的增强功能。

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