Java:PrintStream和PrintWriter之间的区别

问题

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

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


#1 热门回答(120 赞)

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

那么,anOutputStream和aWriter有什么区别?两者都是流,主要区别是aOutputStream是字节流,而Writer是字符流。

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

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

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


#2 热门回答(59 赞)

随着PrintStream你被困在平台的默认编码。

PrintStream stream = new PrintStream(output);

然而,对于PrintWriter,你可以使用特定编码传递OutputStreamWriter

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

好处是,你可以控制字符编码,应该写入字符,使它们最终不会最终asmojibake


#3 热门回答(17 赞)

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