IT-Swarm.Net

Java:PrintStream和PrintWriter之间的区别

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

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

121
Martijn Courteaux

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

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

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

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

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

124
mdma

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

使用 PrintStream 你会遇到平台的默认编码。.

PrintStream stream = new PrintStream(output);

使用 PrintWriter 您可以使用特定编码传递 OutputStreamWriter 。.

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

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

61
BalusC

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

17
Renan Mozone

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

3
sblundy

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

2
Simon Groenewolt