PrintWriter 如何可以写入字节流,而 BufferedWriter 不能?

How PrintWriter can write to byte stream, but BufferedWriter cannot?

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

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 不能写入字节流,因为它是字符流,这意味着必须有人转换这些字符。这就是为什么我们 'give' OutputStreamWriter 作为从字符流到字节流的 桥梁 。那么,为什么PrintWriter不需要这个“桥梁”呢。他们不能有一种编码方式来让我们的生活更轻松吗?还是我错过了什么?

So, how come PrintWriter doesn't need this "bridge".

PrintWriter(OutputStream, ...) 构造函数的 javadocs 声明它们是便利构造函数。简而言之,它们提供了一种快速的方法来完成您可以通过其他方式完成的事情。

Couldn't they have a way of coding and make our lives easier?

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

作为一般规则,为 use-cases 提供了便利的构造函数和方法,这些构造函数和方法被认为足够普遍以保证这一点。

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

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

可能还有 4 个用于提供 non-default 缓冲区大小。

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