29

我搜索了该站点并找到了一些答案,但我无法理解这两个类之间的区别。有人可以解释这两个类之间的区别吗?

4

3 回答 3

25

PrintStream是处理编码字符和其他数据类型的原始桥梁。如果您查看 javadoc,java.io.OutputStream您将看到仅用于编写两种不同数据类型的方法:byteint.

在 JDK (1.0.x) 的早期版本中,当您想要写入字符时,您可以执行以下两种操作之一,将字节写入输出流(假定在系统默认字符集中):

outputStream.write("foobar".getBytes());

或将另一个包装outputStreamPrintStream

PrintStream printStream = new PrintStream(outputStream);
printStream.write("foobar");

看到不同? PrintStream正在处理字符到字节的转换以及编码(上面的构造函数调用使用系统默认编码,但您可以将其作为参数传递)。它还提供了方便的书写方法doubleboolean等等......

事实上System.outSystem.err被定义为PrintStream实例。

JDK 1.1 随之而来,他们意识到他们需要一种更好的方法来处理纯字符数据,因为PrintStream仍然有基于字节的写入方法。所以他们引入了Writer抽象类来严格处理char,Stringint数据。

PrintWriter为其他类型添加方法,如double,boolean等...

现在PrintWriter也有格式打印等的format()/方法...printf()

作为一般规则,如果您正在编写字符数据,请使用Writer实例。如果您正在编写二进制(或混合)数据使用OutputStream实例。

于 2012-07-07T06:09:07.393 回答
10

来自PrintWriter 的 Javadoc

将对象的格式化表示打印到文本输出流。此类实现了 PrintStream 中的所有打印方法。它不包含写入原始字节的方法,程序应该使用未编码的字节流。

可以这样想: aPrintStream位于 some 之上OutputStream。由于输出流处理的是字节而不是字符,因此 PrintStream必须负责将字符编码为字节。OutputStream“仅仅”将字节写入文件/控制台/套接字。

另一方面, APrintWriter位于 a 之上Writer。由于 Writer 负责将字符编码为字节,因此 PrintWriter 不进行编码。我只知道换行符等。(是的,PrintWriters 确实有带Files 和OutputStreams 的构造函数,但这些只是方便。例如,PrintWriter(OutputStream).

从现有的 OutputStream 创建一个新的 PrintWriter,而不自动刷新行。这个方便的构造函数创建了必要的中间 OutputStreamWriter,它将使用默认字符编码将字符转换为字节。

顺便说一句,如果您认为sPrintWriter真的没有太多实用程序,请记住 PrintWriter 和 PrintStream 都IOException从打印逻辑中吸收 s 。

于 2012-07-07T05:46:45.497 回答
3

添加马特的答案:

我比较PrintStreamPrintWriter最有用的部分,构造函数和print()、println()、printf()/format()函数都被这两个类所支持。ClassName(String fileName, String charsetName)

区别在于:

因为JDK1.0vsJDK1.1

构造函数:

PrintStream(OutputStream out, boolean autoFlush, String charsetName)
PrintWriter(Writer wr)
PrintWriter(Writer wr, boolean autoFlush)

FilterOutputStream从/ OutputStreamvs继承的方法Writer,差异归结为bytevs char

PrintStream.write(byte[] buffer, int offset, int count)
PrintStream.write(byte[] buffer)
PrintStream.write(int oneByte)

PrintWriter.write(int oneChar)
PrintWriter.write(char[] buf)
PrintWriter.write(char[] buf, int offset, int count)
PrintWriter.write(String str)
PrintWriter.write(String str, int offset, int count)

PrintStream.printf()对应于PrintWriter.format()

它确实看起来像在 1.1 中。他们想出了一个更好的类,但不能在不破坏现有程序的情况下删除旧的 1.0 类。

于 2015-03-20T12:23:47.553 回答