爪哇:PrintStream 和 PrintWriter 之间的区别
-
26-09-2019 - |
题
有什么区别 PrintStream
和 PrintWriter
?它们有许多共同的方法,因此我经常混淆这两个类。此外,我认为我们可以将它们用于完全相同的事情。但必须有区别,否则就只有一个班级了。
我搜索了档案,但找不到这个问题。
解决方案
这听起来轻率,但PrintStream
打印到一个OutputStream
,和PrintWriter
打印到Writer
。好吧,我怀疑我会得到任何点说明明显。但还有更多。
那么,是什么样的OutputStream
和Writer
之间的区别?
两者都是流,与主要区别在于一个OutputStream
是一个字节流而Writer
是字符流。
如果用字节,那OutputStream
的PrintStream.print(String)
交易?它可以转换字符使用默认的平台编码字节。使用默认的编码一般是一件坏事,因为它可以从一个平台迁移到另一个时导致的错误,特别是如果你生成一个平台的文件和使用它的另一个。
通过一个Writer
时,通常指定要使用的编码,避免任何平台的依赖关系。
何必具有在JDK一个PrintStream
,由于主要目的是写字符,而不是字节? PrintStream
早于JDK 1.1时被引入读/写字符流。我想象太阳会弃用PrintStream
如果只有一个事实,它是如此广泛的应用。 (毕竟,你不希望每次调用System.out
产生弃用的API警告!而且,改变从PrintStream
类型在标准输出流将会破坏现有的应用程序PrintWriter
。)
其他提示
随着 PrintStream
您必须使用平台的默认编码。
PrintStream stream = new PrintStream(output);
随着 PrintWriter
但是你可以通过 OutputStreamWriter
具有特定的编码。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
好处是,您可以控制应该写入的字符编码,这样它们最终不会成为 莫吉巴克.
由于JDK 1.4有可能指定一个PrintStream的字符编码。因此,为PrintStream和PrintWriter的之间的差异只有约自动冲洗行为和一个PrintStream不能完成一个Writer。
像的PrintWriter作家是文本输出,流是二进制输出。作家处理字符集的东西给你。因为它假设你不希望那种转换,这将弄乱你的二进制数据,并会如果你没有使用一个作家流不。
可以写入流的原始字节,而不是作家。该 PrintWriter的 javadoc中列出了其他差异(最重要的是,能够设置上的流的编码,因此它可以解释的原始字节我说)。
核心Java 通过HORSTMANN
Java的退伍军人可能不知道发生了什么给的PrintStream类和到System.out。在Java 1.0时,为PrintStream类简单地丢弃截断所有Unicode字符转换为ASCII字符 最高字节。 (此时,Unicode的仍然是一个16位的编码。)很明显,这不是一个干净或 便携式的做法,它被固定在Java 1.1中引入的读者和作者。对于 与现有代码兼容,System.in下,System.out,和System.err仍然输入/输出 流,无以读者和作家。但现在的PrintStream类内部的Unicode转换 字符以同样的方式做的PrintWriter编码默认主机。类型的对象 PrintStream的行为完全一样,当您使用的打印和println方法打印的作家,但不像 打印作家它们允许你与写入(int)和写(字节[])方法输出的原始字节。
的PrintWriter是PrintStream的增强。
即。 PrintStream的为特定目的。