Java PrintWriter如何写入字节流,而BufferedWriter却不能?

Java PrintWriter如何写入字节流,而BufferedWriter却不能?,java,io,printwriter,bufferedwriter,writer,Java,Io,Printwriter,Bufferedwriter,Writer,首先,我将提供一段带有注释的代码: 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 = ne

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

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
不需要这个“桥”。难道他们就不能有一种编码方式,让我们的生活更轻松吗?还是因为我错过了什么

那么,为什么PrintWriter不需要这个“桥”

PrintWriter(OutputStream,…)
构造函数的。简言之,它们提供了一种快速的方式来做一些你可以用另一种方式做的事情

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

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

作为一般规则,为被认为足够常见的用例提供方便的构造函数和方法来保证这一点

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

  • BufferedWriter(OutputStream)
    使用默认字符集
  • BufferedWriter(OutputStream,String)
    提供字符集名称
  • BufferedWriter(输出流,字符集)
    提供字符集
  • BufferedWriter(OutputStream,CharsetEncoder)
    直接提供charset编码器
可能还有4个以提供非默认缓冲区大小


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

我想我明白了,我脑子里有个想法:)我不能这么做,因为BufferedWriter只是一个装饰类,对吧?我需要一个“具体的类”,它实际上做了一些事情。所以使用BufferedWriter,我甚至可以包装PrintWriter,但我总是需要“必须工作”的类。接近回答了吗?没错,
BufferedWriter
只能向
Writer
写入,例如
PrintWriter
。它为任何写入程序添加缓冲,但它不能(也不应该)单独进行文本到字节的转换。
PrintWriter
将此作为一种“方便功能”,但提供它甚至不是一个好主意
BufferedWriter
并不麻烦——它可以/应该使用
OutputStreamWriter
桥接器来工作。对,
Writer
接受(原始)流。然后将写入程序包装在一个
缓冲写入程序中
。这是一个分为两步的过程,有时是痛苦的,但在我看来,清晰和控制是非常值得的。