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