PrintStream
和PrintWriter
的区别是什么?由于它们有许多共同的方法,所以我经常混淆这两个类。此外,我认为我们可以将它们用于完全相同的事情。但必须有一个区别,否则就只会有一个类。
我已经搜索了档案,但找不到这个问题。
PrintStream
和PrintWriter
的区别是什么?由于它们有许多共同的方法,所以我经常混淆这两个类。此外,我认为我们可以将它们用于完全相同的事情。但必须有一个区别,否则就只会有一个类。
我已经搜索了档案,但找不到这个问题。
PrintStream
将内容打印到OutputStream
中,而PrintWriter
则将内容打印到Writer
中。虽然显而易见,但这里有更多的细节。
那么,OutputStream
和Writer
之间有什么区别呢?二者都是流,主要区别在于OutputStream
是字节流,而Writer
则是字符流。
如果OutputStream
处理字节,那么PrintStream.print(String)
又是怎么处理字符串的呢?它使用默认平台编码将字符转换为字节。使用默认编码通常是一个坏习惯,因为它可能会导致从一个平台到另一个平台时出现错误,特别是如果你在一个平台上生成文件并在另一个平台上使用时。
对于Writer
,您通常需要指定要使用的编码,以避免任何平台依赖性问题。
既然主要意图是写字符而不是字节,为什么在JDK中还需要有PrintStream
呢?PrintStream
比JDK 1.1引入的Reader/Writer字符流更早。我想Sun会将其弃用,只是因为它被广泛使用。(毕竟,您不希望每次调用System.out
都会生成弃用的API警告!此外,将标准输出流的类型从PrintStream
更改为PrintWriter
将破坏现有应用程序。)PrintStream
不再仅限于使用平台默认编码;它有接受字符集名称的构造函数。因此,PrintStream
和PrintWriter
之间的区别在于,PrintWriter
不能写入原始字节,并且这两个类封装了不同类型的目标。 - Ted HoppPrintStream
的 print()
方法是方便函数,会调用 write()
,因此如果启用了自动刷新,它们会触发自动刷新。另一方面,PrintWriter
在调用 print()
后不会自动刷新。今天我正在演示一些初学者 Java,这让一些不熟悉手动刷新需求的学生感到困惑。除此之外,你的回答很棒。 - Robadobprintwriter
。 - Robadob像PrintWriter这样的写入器是用于文本输出的,而流是用于二进制输出的。这些写入器为您处理字符集问题。流不会处理,因为假定您不希望进行这种转换,否则会破坏二进制数据,并且如果需要的话,应该使用写入器。
来自Horstmann的核心Java
Java老手可能会想知道PrintStream类和System.out去哪了。在Java 1.0中,PrintStream类只是通过丢弃最高字节将所有Unicode字符截断为ASCII字符。(当时,Unicode仍然是16位编码)。显然,这不是一种干净或可移植的方法,并且在Java 1.1引入读者和写者后进行了修复。为了兼容现有代码,System.in、System.out和System.err仍然是输入/输出流,而不是读者和写者。但现在,PrintStream类在内部以与PrintWriter相同的方式将Unicode字符转换为默认主机编码。当您使用print和println方法时,PrintStream类型的对象的行为与打印作者完全相同,但与打印作者不同,它们允许您使用write(int)和write(byte [])方法输出原始字节。
PrintWriter 是 PrintStream 的增强版。
即为特定目的而设计的 PrintStream。