问题
PrintStream
和PrintWriter
有什么区别?他们有许多共同的方法,因此我经常混合这两个类。而且,我认为我们可以将它们用于完全相同的事情。但必须有区别,否则,只会有一个班级。
我搜索了档案,但找不到这个问题。
#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警告!另外,在标准输出流中更改类型PrintStream
到PrintWriter
会破坏现有的应用程序。)
#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。