Java:PrintStream和PrintWriter的区别
Java:PrintStream和PrintWriter的区别,java,io,printwriter,printstream,Java,Io,Printwriter,Printstream,PrintStream和PrintWriter之间有什么区别?它们有许多共同的方法,因此我经常将这两个类混合在一起。此外,我认为我们可以用它们做完全相同的事情。但必须有所不同,否则,就只有一门课了 我已经搜索了档案,但找不到这个问题。这听起来可能有些轻率,但是PrintStream会打印到OutputStream,而PrintWriter会打印到Writer。好吧,我怀疑我是否会因为陈述显而易见的事实而得到任何分数。但还有更多 那么,OutputStream和Writer之间有什么区别呢? 两者
PrintStream
和PrintWriter
之间有什么区别?它们有许多共同的方法,因此我经常将这两个类混合在一起。此外,我认为我们可以用它们做完全相同的事情。但必须有所不同,否则,就只有一门课了
我已经搜索了档案,但找不到这个问题。这听起来可能有些轻率,但是
PrintStream
会打印到OutputStream
,而PrintWriter
会打印到Writer
。好吧,我怀疑我是否会因为陈述显而易见的事实而得到任何分数。但还有更多
那么,OutputStream
和Writer
之间有什么区别呢?
两者都是流,主要区别是OutputStream
是字节流,而Writer
是字符流
如果OutputStream
处理字节,那么PrintStream.print(String)
呢?它使用默认的平台编码将字符转换为字节。使用默认编码通常是一件坏事,因为当从一个平台移动到另一个平台时,它可能会导致错误,特别是当您在一个平台上生成文件并在另一个平台上使用它时
使用编写器
,通常可以指定要使用的编码,从而避免任何平台依赖关系
为什么要在JDK中设置
PrintStream
,因为其主要目的是写入字符,而不是字节PrintStream
早于JDK1.1,当时引入了读写器字符流。如果只是因为它被如此广泛地使用的话,我想Sun可能会反对使用它。(毕竟,您不希望每次调用System.out
都生成一个不推荐使用的API警告!而且,在标准输出流上将类型从PrintStream
更改为PrintWriter
会破坏现有的应用程序。)像PrintWriter这样的编写器用于文本输出,而流则用于二进制输出。编剧为你处理角色集的东西。流不需要,因为它假定您不需要这种转换,这会弄乱您的二进制数据,如果您需要的话,将使用写入器。您可以将原始字节写入流,而不是写入器。javadoc列出了其他差异(最重要的是,能够在流上设置编码,以便它可以解释原始字节)。自JDK1.4以来,可以为打印流指定字符编码。因此,PrintStream和PrintWriter之间的区别仅在于自动刷新行为,并且PrintStream不能包装写入程序。PrintWriter是PrintStream的增强功能
即用于特定目的的打印流。来自Horstmann的core java
Java老手可能想知道PrintStream类和System.out到底发生了什么。在爪哇
在1.0中,PrintStream类通过删除将所有Unicode字符截断为ASCII字符
顶部字节。(当时,Unicode仍然是一种16位编码。)显然,这不是一种干净或简单的编码
可移植的方法,通过在Java1.1中引入阅读器和编写器,它得到了修复。对于
与现有代码、System.in、System.out和System.err的兼容性仍然是输入/输出
流,而不是读者和作者。但是现在PrintStream类在内部转换Unicode
以与PrintWriter相同的方式将字符转换为默认主机编码。类型的对象
当您使用print和println方法时,PrintStream的行为与print writer完全相同,但与
打印写入程序它们允许您使用write(int)和write(byte[])方法输出原始字节
这也是我的想法——但不是真的。甚至PrintStream也会在引擎盖下维护一个Writer—如果你给它传递一个OutputStream,它会将它包装。@Jon—内部有一个Writer,但它会写入一个OutputStream,所以最终的效果是PrintStream会写入一个OutputStream—发生字符到字节的转换,并使用默认的平台编码。PrintWriter中不需要字符->字节转换,您可以一直使用字符。“默认字符集在虚拟机启动期间确定,通常取决于基础操作系统的区域设置和字符集。”此外,在某些平台上,区域设置会更改默认字符集。由于Java 1.5,
PrintStream
不限于使用平台默认编码;存在接受字符集名称的构造函数。因此,PrintStream
和PrintWriter
之间的区别在于,PrintWriter
不能写入原始字节,这两个类包装不同类型的目的地。可能值得注意的是,它们的行为也存在显著差异,虽然它们有效地共享一个接口PrintStream
,但它们的print()
方法是调用write()
的方便函数,因此,如果启用,它们会触发自动刷新<另一方面,调用print()
后,code>PrintWriter将不会自动刷新。我今天演示了一些Java初学者,这让一些不熟悉手动刷新需要的学生感到困惑。否则,您的答案很好。除了PrintStream,因为它采用了编码,因此可以处理比标准OutputStream多一点的内容。听起来很奇怪,System.out(其唯一目标是打印字符串)实际上是一个PrintStream。“编写者为您处理字符集内容”--仅处理将字符转换为字节的写入程序。不是所有的作者都这么做。+1好问题,我也混淆了这两个类,API文档也没有多大帮助。另一个区别是autoflush的工作方式。对于写入程序,输出中存在\n字符会触发flush()。但是在字节流(PrintStream)中只有字节。然后,自动刷新工作正常