PrintStream vs PrintWriter

时间:2012-07-07 05:30:43

标签: java

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

3 个答案:

答案 0 :(得分:18)

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

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

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

或将另一个输出流包装在PrintStream

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

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

实际上,System.out和System.err被定义为PrintStream实例。

随着JDK 1.1的推出,他们意识到他们需要一种更好的方法来处理纯字符数据,因为PrintStream仍然具有基于字节的写入方法。所以他们介绍了#34; Writer"抽象类严格处理字符,字符串和int数据。

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

现在PrintWriter还有格式化打印等格式()/ printf()方法......

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

答案 1 :(得分:8)

来自Javadoc for PrintWriter

  

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

以这种方式思考:PrintStream位于某些OutputStream之上。由于输出流处理字节而不是字符,因此PrintStream 必须负责将字符编码为字节。 OutputStream'仅'将字节写入文件/控制台/套接字。

另一方面,PrintWriter位于Writer之上。由于Writer负责将字符编码为字节,因此PrintWriter不进行编码。我只知道换行符等(是的,PrintWriters的构造函数需要FileOutputStream,但这些只是方便。例如,PrintWriter(OutputStream)

  

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

顺便说一句,如果您认为PrintWriter确实没有多大用处,请记住PrintWriter和PrintStream都会从打印逻辑中吸收IOException

答案 2 :(得分:2)

添加马特的回答:

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

区别在于:

JDK1.0 vs JDK1.1

以来

构造

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

FilterOutputStream / OutputStream vs Writer继承的方法,差异归结为byte vs 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课程。