【发布时间】: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