首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PrintStream vs PrintWriter

PrintStream vs PrintWriter
EN

Stack Overflow用户
提问于 2012-07-07 13:30:43
回答 3查看 13.5K关注 0票数 27

我已经搜索了这个网站,找到了一些答案,但我很难理解这两个类之间的区别。有人能解释一下这两个类之间的区别吗?

EN

回答 3

Stack Overflow用户

发布于 2012-07-07 14:09:07

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

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

代码语言:javascript
复制
outputStream.write("foobar".getBytes());

或者将另一个outputStream包装在PrintStream

代码语言:javascript
复制
PrintStream printStream = new PrintStream(outputStream);
printStream.write("foobar");

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

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

随之而来的是JDK1.1,他们意识到他们需要一种更好的方法来处理纯字符数据,因为PrintStream仍然有基于字节的编写方法。因此,他们引入了Writer抽象类来严格处理charStringint数据。

PrintWriter为其他类型添加了方法,如doubleboolean等。

现在PrintWriter也有用于格式化打印等的format() / printf()方法。

一般来说,如果要编写字符数据,请使用Writer实例。如果要编写二进制(或混合)数据,请使用OutputStream实例。

票数 23
EN

Stack Overflow用户

发布于 2012-07-07 13:46:45

Javadoc for PrintWriter

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

可以这样想:一个PrintStream位于某个OutputStream之上。由于输出流处理的是字节而不是字符,因此PrintStream必须负责将字符编码为字节。OutputStream‘只是’将字节写出到文件/控制台/套接字中。

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

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

顺便说一句,如果你认为PrintWriter实际上没有太多的实用程序,请记住PrintWriter和PrintStream都从打印逻辑中吸收了IOException

票数 10
EN

Stack Overflow用户

发布于 2015-03-20 20:23:48

要添加Matt的答案:

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

区别在于:

由于JDK1.0 vs JDK1.1

构造函数:

代码语言:javascript
复制
PrintStream(OutputStream out, boolean autoFlush, String charsetName)
PrintWriter(Writer wr)
PrintWriter(Writer wr, boolean autoFlush)

方法继承自FilterOutputStream/OutputStreamWriter,区别可以归结为bytechar

代码语言:javascript
复制
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类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11372546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档