Java:PrintStream和PrintWriter之间的区别

Mar*_*aux 121 java io printstream printwriter

PrintStream和之间有什么区别PrintWriter?他们有许多共同的方法,因此我经常混合这两个类.而且,我认为我们可以将它们用于完全相同的事情.但必须有区别,否则,只会有一个班级.

我搜索了档案,但找不到这个问题.

mdm*_*dma 126

这可能听起来很轻浮,但PrintStream打印到OutputStream,并PrintWriter打印到Writer.好吧,我怀疑我会说明显而易见的任何要点.但还有更多.

那么,OutputStreama和a 之间有什么区别Writer?两者都是流,主要区别是a OutputStream是字节流,而Writer是字符流.

如果Writer处理字节,那么OutputStream呢?它使用默认平台编码将字符转换为字节.使用默认编码通常是一件坏事,因为当从一个平台移动到另一个平台时,它可能会导致错误,特别是如果您在一个平台上生成文件并在另一个平台上使用它.

使用a PrintStream.print(String),您通常会指定要使用的编码,从而避免任何平台依赖性.

为什么麻烦Writer在JDK中,因为主要意图是写字符,而不是字节?PrintStream在引入Reader/Writer字符流时,早于JDK 1.1.我想PrintStream如果只是因为它如此广泛使用,Sun会弃用.(毕竟,您不希望每次调用都PrintStream生成一个弃用的api警告!此外,将类型从标准输出流更改System.outPrintStreamon会破坏现有应用程序.)

  • 从Java 1.5开始,`PrintStream`并不仅限于使用平台默认编码; 有一些构造函数接受一个charset名称.因此,"PrintStream"和"PrintWriter"之间的区别在于:"PrintWriter"不能写入原始字节,并且这两个类包装了不同类型的目标. (6认同)
  • 这也是我的想法 - 但事实并非如此.甚至PrintStream都会在引擎盖下维护一个Writer - 如果你传递一个OutputStream,它就会包装它. (3认同)
  • @Jon - 在内部,有一个Writer,但它写入一个OutputStream,因此净效果是PrintStream写入OutputStream - 发生char到字节转换,并使用默认的平台编码.在PrintWriter中没有char->字节转换的这种要求,你可以一直使用字符. (3认同)
  • 我错过了一个无法将作家传递给PrintStream建设者的事实...... (2认同)
  • 您可能还需要注意它们的行为的显着差异,同时它们有效地共享一个接口 `PrintStream` 的 `print()` 方法是调用 `write()` 的便利函数,因此如果启用它们会触发自动刷新。另一方面,`PrintWriter` 在调用 `print()` 后不会自动刷新。我今天一直在演示一些 Java 初学者,这让一些不熟悉手动刷新需求的学生脱颖而​​出。否则你的答案很棒。 (2认同)

Bal*_*usC 60

随着PrintStream你坚持平台的默认编码.

PrintStream stream = new PrintStream(output);
Run Code Online (Sandbox Code Playgroud)

PrintWriter然而,您可以通过OutputStreamWriter特定的编码传递.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

好处是,您可以控制字符编码,应该写入字符,使它们最终不会像mojibake一样.

  • 从1.4开始,PrintStream有一个新的构造函数,它接受编码`PrintStream(OutputStream out,boolean autoFlush,String encoding)` (10认同)

Ren*_*one 18

从JDK 1.4开始,可以为PrintStream指定字符编码.因此,PrintStream和PrintWriter之间的区别仅在于自动刷新行为,而PrintStream无法包装Writer.