我已经搜索了网站并找到了一些答案,但是我很难理解这两个类之间的区别。有人能解释一下这两个类之间的区别吗?
我已经搜索了网站并找到了一些答案,但是我很难理解这两个类之间的区别。有人能解释一下这两个类之间的区别吗?
PrintStream
是最初用于处理字符编码和其他数据类型的桥梁。如果您查看 java.io.OutputStream
的 javadoc,您将只看到写入两种不同数据类型(byte
和 int
)的方法。
在 JDK 的早期版本(1.0.x)中,当您想要写入字符时,可以采取以下两种方法之一:向输出流写入字节(假定字节采用系统默认字符集):
outputStream.write("foobar".getBytes());
或者将另一个outputStream
包装在PrintStream
中:
PrintStream printStream = new PrintStream(outputStream);
printStream.write("foobar");
看到区别了吗? PrintStream
负责将字符转换为字节,并进行编码(上面的构造函数使用系统默认编码,但您可以将其作为参数传递)。 它还提供了方便的方法来写入 double
、boolean
等等。实际上,System.out
和 System.err
都被定义为 PrintStream
实例。
然后 JDK 1.1 推出了,他们意识到需要更好地处理纯字符数据,因为 PrintStream
仍然具有基于字节的写入方法。所以他们推出了 Writer
抽象类,专门用于处理 char
、String
和 int
数据。
PrintWriter
添加了其他类型的方法,如 double
、boolean
等等。
现在,PrintWriter
还有 format()
/ printf()
等格式化打印方法等等。
一般而言,如果您正在编写字符数据,请使用 Writer
实例。如果您正在编写二进制(或混合)数据,请使用 OutputStream
实例。
System.out
和 System.err
仍然是 PrintStream
。 - Franklin Yu将对象的格式化表示输出到文本输出流。此类实现了PrintStream中的所有print方法。它不包含用于写入原始字节的方法,程序应使用未编码的字节流。
可以这样想:一个PrintStream
位于某个OutputStream
之上。由于输出流处理的是字节而不是字符,因此PrintStream必须负责将字符编码为字节。OutputStream“仅”将字节写入文件/控制台/套接字等。
另一方面,PrintWriter
位于Writer
之上。由于Writer负责将字符编码为字节,因此PrintWriter不会进行编码。它只知道换行符等。(是的,PrintWriters确实有用于接受File和OutputStream的构造函数,但那些只是便利。例如,PrintWriter(OutputStream)
)。
从现有的OutputStream创建一个没有自动换行的新PrintWriter。这个便利构造函数将创建必要的中间OutputStreamWriter,它将使用默认字符编码将字符转换为字节。
顺便说一句,如果您认为PrintWriter
实际上没有多少用处,请记住,PrintWriter和PrintStream都会吸收来自打印逻辑的IOException
。
PrintStream(OutputStream out, boolean autoFlush, String charsetName)
PrintWriter(Writer wr)
PrintWriter(Writer wr, boolean autoFlush)
从FilterOutputStream
/OutputStream
继承的方法与Writer
的区别在于它们处理的数据类型不同:byte
和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类,因为这会破坏现有的程序。