【问题标题】:How PrintWriter can write to byte stream, but BufferedWriter cannot?PrintWriter 如何写入字节流,而 BufferedWriter 不能?
【发布时间】:2020-11-01 00:32:01
【问题描述】:

首先,我将提供一段带有 cmets 的代码:

FileOutputStream fos = new FileOutputStream ("test.txt");
//fos IS-A OutputStream as FileOutputStream extends OutputStream

PrintWriter pw = new PrintWriter (fos); //compiles (can take OutputStream)

BufferedWriter bw = new BufferedWriter (fos); //doesn't compile (can't take OutputStream)
//Need to do this:
BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (fos)); //compiles

我以为我知道 I/O 流,直到我遇到这个错误。有人能解释一下PrintWriter 如何写入字节流,而BufferedWriter 不能吗?他们不应该是一样的吗?我一直认为它们是平等的(意味着内部实现),但区别在于它们拥有的方法。

看来我错了 :) 我是这样看的:BufferedWriter 无法写入字节流,因为它是字符流,这意味着必须有人转换这些字符。这就是为什么我们“给予”OutputStreamWriter 作为从字符流到字节流的桥梁。那么,PrintWriter 怎么不需要这个“桥梁”。难道他们不能有一种编码方式,让我们的生活更轻松吗?还是我错过了什么是我的错?

【问题讨论】:

  • 我想我明白了,我脑子里有些东西裂开了:) 我做不到,因为 BufferedWriter 只是一个装饰器类,对吧?我需要一个真正做某事的“具体课程”。所以使用 BufferedWriter 我什至可以包装 PrintWriter,但我总是需要“必须工作”的类。接近回答了吗?
  • 你说得对,BufferedWriter 只能写给Writer,例如PrintWriter。它为任何 Writer 添加了缓冲,但它不能(也不应该)自己进行文本到字节的转换。
  • PrintWriter 将此作为“便利功能”,但可以说提供它根本不是一个好主意。 BufferedWriter 不会打扰 - 您可以/应该使用 OutputStreamWriter 桥接器。
  • 对,Writer 采用(原始)流。然后将 Writer 包裹在 BufferedWriter 中。这是一个两步的过程,有时会很痛苦,但清晰和控制是非常值得的。

标签: java io printwriter bufferedwriter writer


【解决方案1】:

那么,PrintWriter 怎么不需要这个“桥”呢。

PrintWriter(OutputStream, ...) 构造函数的 javadocs 声明它们是便利构造函数。简而言之,它们提供了一种快速的方法来做一些你可以用另一种方法做的事情。

难道他们不能有一种编码方式,让我们的生活更轻松吗?

您现在指的是 BufferedWriter 没有采用 OutputStream 参数的便捷构造函数。

作为一般规则,便利的构造函数和方法是为被认为足够常见的用例提供的。

在这种情况下,他们可能需要提供许多个方便的构造函数:

  • BufferedWriter(OutputStream) 使用默认字符集。
  • BufferedWriter(OutputStream, String) 提供字符集名称
  • BufferedWriter(OutputStream, Charset) 提供字符集
  • BufferedWriter(OutputStream, CharsetEncoder) 直接提供字符集编码器

可能还有 4 个以提供非默认缓冲区大小。

我想他们不认为这是合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多