Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:PrintStream和PrintWriter的区别_Java_Io_Printwriter_Printstream - Fatal编程技术网

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)中只有字节。然后,自动刷新工作正常