【问题标题】:PrintStream vs PrintWriterPrintStream 与 PrintWriter
【发布时间】:2012-07-07 12:33:12
【问题描述】:

我已经搜索了该站点并找到了一些答案,但我无法理解这两个类之间的区别。有人可以解释这两个类之间的区别吗?

【问题讨论】:

  • PrintStream 处理bytes,而PrintWriter 处理chars。就是这样。
  • 但是您可以使用 PrintStream 来编写字符串、字符、整数等。也许我误解了您所说的处理字节的意思
  • @Eng.Fouad:这个问题很好,值得更详细的回答,特别是如果您认为 System.out 实际上是 PrintStream,讽刺的是它不是 PrintWriter,而它的目标是绝对要打印字符,而不是字节。另请参阅:stackoverflow.com/questions/2822005/…,它带来了更多详细信息。

标签: java


【解决方案1】:

PrintStream 是处理编码字符和其他数据类型的原始桥梁。如果您查看 java.io.OutputStream 的 javadoc,您将看到仅用于编写两种不同数据类型的方法:byteint

在 JDK (1.0.x) 的早期版本中,当您想要写入字符时,您可以执行以下两种操作之一,将字节写入输出流(假定在系统默认字符集中):

outputStream.write("foobar".getBytes());

或将另一个outputStream 包装在PrintStream 中:

PrintStream printStream = new PrintStream(outputStream);
printStream.write("foobar");

看到区别了吗? PrintStream 正在处理字符到字节的转换以及编码(上面的构造函数调用使用系统默认编码,但您可以将其作为参数传递)。还提供了写doubleboolean等的便捷方法......

实际上System.outSystem.err 被定义为PrintStream 实例。

JDK 1.1 随之而来,他们意识到他们需要一种更好的方法来处理纯字符数据,因为PrintStream 仍然具有基于字节的写入方法。于是他们引入了Writer抽象类来严格处理charStringint数据。

PrintWriterdoubleboolean 等其他类型添加方法...

如今PrintWriter 也有format() / printf() 格式打印等方法...

作为一般规则,如果您正在写入字符数据,请使用 Writer 实例。如果您正在编写二进制(或混合)数据,请使用 OutputStream 实例。

【讨论】:

  • 历史确实有帮助,并解释了为什么 System.outSystem.err 仍然是 PrintStream
【解决方案2】:

来自Javadoc for PrintWriter

将对象的格式化表示打印到文本输出流。此类实现了 PrintStream 中的所有打印方法。它不包含写入原始字节的方法,程序应该使用未编码的字节流。

这样想:PrintStream 位于一些 OutputStream 之上。由于输出流处理的是字节而不是字符,因此 PrintStream 必须负责将字符编码为字节。 OutputStream '仅仅' 将字节写入文件/控制台/套接字。

另一方面,PrintWriter 位于 Writer 之上。由于 Writer 负责将字符编码为字节,因此 PrintWriter 不进行编码。我只知道换行符等。(是的,PrintWriters 确实有采用 Files 和 OutputStreams 的构造函数,但这些只是方便。例如,PrintWriter(OutputStream)

从现有的 OutputStream 创建一个新的 PrintWriter,而不自动刷新行。这个方便的构造函数创建了必要的中间 OutputStreamWriter,它将使用默认字符编码将字符转换为字节。

顺便说一句,如果您认为 PrintWriter 真的没有太多实用性,请记住 PrintWriter 和 PrintStream 都从打印逻辑中吸收 IOExceptions。

【讨论】:

    【解决方案3】:

    添加马特的答案:

    我比较了PrintStreamPrintWriter, 最有用的部分是构造函数 ClassName(String fileName, String charsetName)print()、println()、printf()/format() 函数,这两个类都支持.

    区别在于:

    因为JDK1.0 vs JDK1.1

    构造函数:

    PrintStream(OutputStream out, boolean autoFlush, String charsetName)
    PrintWriter(Writer wr)
    PrintWriter(Writer wr, boolean autoFlush)
    

    方法继承自FilterOutputStream/OutputStream vs Writer,区别归结为byte vs char

    PrintStream.write(byte[] buffer, int offset, int count)
    PrintStream.write(byte[] buffer)
    PrintStream.write(int oneByte)
    
    PrintWriter.write(int oneChar)
    PrintWriter.write(char[] buf)
    PrintWriter.write(char[] buf, int offset, int count)
    PrintWriter.write(String str)
    PrintWriter.write(String str, int offset, int count)
    

    PrintStream.printf()对应PrintWriter.format()

    它确实看起来像 1.1 中的。他们想出了一个更好的类,但不能在不破坏现有程序的情况下删除旧的 1.0 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多