输出流(OutputStream)和写入器(Writer)有什么区别?

14
有人能解释一下OutputStreamWriter之间的区别吗?我应该使用这两个类中的哪一个?

5
这个问题没有得到足够的关闭票。它是一个真正的问题,有一个真正的答案。 - T.J. Crowder
1
我的投票是因为真正的答案在Javadoc中,而提问者应该首先查看Javadoc,所以这个问题没有永久价值。 - user207421
5个回答

19

流(Streams)在字节级别上运作,它们可以向流中读取(InputStream)和写入(OutputStream)字节或字节列表。

读取器(Reader)/写入器(Writer)在流的基础上增加了字符概念。由于字符只能通过使用编码进行字节转换,因此读取器和写入器具有编码组件(可以自动设置,因为Java具有默认编码属性)。读取器读取(Reader)或写入器写入(Writer)的字符会被编码自动转换为字节并发送到流中。


我有一个关于这个的问题:在 System.out.println 中使用的 PrintStream 本质上是一个 OutputStream,当我输入 UTF-8 字符时也需要处理编码。所以难道它不应该是 PrintWriter 吗?感谢您的解释。 - math
非常好的问题。我怀疑System.out作为PrintStream是一种传统遗产,后来可能很难改变。正如文档所解释的那样,PrintStream始终使用默认编码,并且建议使用PrintWriter而不是使用PrintStream。 - Vincent Robert
谢谢你的解释,我总是忘记Java有多老,遗留兼容性是一个被低估的负担。正如德国人所说的一句话:例外证实规则。 - math

8

OutputStream类会逐字节地向目标写入数据,而Writer类则会逐字符地向目标写入数据。


5
值得注意的是,在Java中,“Character”这个术语其实并不准确,它实际上代表的是一个UTF-16 [Code Unit](http://unicode.org/glossary/#code_unit),而不是Unicode [Character](http://unicode.org/glossary/#character)或[Code Point](http://unicode.org/glossary/#code_point)。 - Christoffer Hammarström

3
一个OutputStream是一个可以写入信息的流。这个定义比较通用,因此有专门用于文件写入的特定OutputStream。一个流只能写入字节数组。 Writer提供了更多的灵活性,它们可以写入字符甚至字符串,并考虑到特殊编码。
选择哪一个取决于你想要写什么。如果你已经有了字节,你可以直接使用流。如果你有字符或字符串,你需要将它们转换为字节,如果你想将它们写入流中,或者你需要使用一个Writer来完成这个任务。

你永远不能直接将字符写入流,它们必须先被编码为字节,在Java中这意味着它们将始终进入“OutputStream”,例如通过“OutputStreamWriter”。 - Christoffer Hammarström
请引用我说过的一句话,其中我提到了你可以将字符串写入流中。 - Thorsten Dittmar
你编辑了它,然后说:“我说过你可以使用Writer将字符串写入流中。” - Christoffer Hammarström
你不需要向我解释它是如何工作的。请引用我错误的那一行,而不是担心你的答案受到挑战并要求引用。 - Christoffer Hammarström
我只是没看懂你为什么在第一时间写下了你的第一条评论,理由似乎只有一个,就是我的回答是不正确的,而我又没有看到哪里不正确。所以我想问你告诉我在哪里不正确。就这样。 - Thorsten Dittmar
显示剩余4条评论

1

OutputStream 使用裸字节,而 Writer 使用 编码的 字符。


1
实际上,Writer 使用 UTF-16 代码单元,而不是编码字符 - Christoffer Hammarström

1

读者/写者类层次结构是面向字符的,而输入流/输出流类层次结构是面向字节的。基本上有两种类型的流。字节流用于处理字节流,而字符流用于处理字符流。在字节流中,输入/输出流是层次结构顶部的抽象类,而在字符流层次结构中,Writer/Reader是顶部的抽象类。

点击此处获取更多详细信息

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接