FileWrite BufferedWriter和PrintWriter相结合

Aho*_*tbi 17 java filewriter bufferedwriter printwriter

好的,我正在学习I/O,我在其中一张幻灯片中找到了以下代码.有谁可以解释为什么需要有FileWrite,BufferedWriter和PrintWriter?我知道BufferedWriter是缓冲输出并将其全部放在一起,但为什么他们会使用FileWriter和PrintWriter?他们几乎没有做同样的错误处理等一点点差异?

还有他们为什么要传递bw给他们PrintWriter

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 24

据推测他们正在使用a,FileWriter因为他们想要写入文件.双方BufferedWriterPrintWriter必须得到另一位作家写-你需要一些最终目的地.

(我个人不喜欢,FileWriter因为它不允许你指定编码.我更喜欢使用FileOutputStream包装OutputStreamWriter,但这是另一回事.)

BufferedWriter正如你所说的,它用于缓冲 - 虽然它不会缓冲所有输出,只是它的一个固定量(缓冲区的大小).它为底层作者创建了"更大"的写作.

至于使用PrintWriter- 嗯,暴露了一些额外的方法,如println.我个人不喜欢它,因为它吞下异常(你必须明确地检查checkError,仍然没有给出细节,我不认为我曾经见过使用),但同样这取决于你在做什么.该PrintWriter传递的BufferedWriter它的目的地.

因此,您所显示的部分下面的代码可能PrintWriter会写入,将写入BufferedWriter,将(当其缓冲区已满,或者已刷新或关闭时)写入FileWriter,然后将字符数据转换为磁盘上的字节数.

  • @Rollerball如果你没有将`BufferedWriter`传递给`PrintWriter`文档说明"..没有缓冲,每次调用print()方法都会导致字符被转换成字节,然后立即写入文件,这可能效率很低......" (3认同)
  • 你是说将BufferedWriter传递给PrintWriter.真的需要吗?PrintWriter本身是缓冲的.尝试打印一些东西而不用冲洗它. (2认同)

小智 6

来自Docs:

通常,Writer会立即将其输出发送到基础字符或字节流.除非需要提示输出,否则建议将BufferedWriter包装在其write()操作可能代价高昂的任何Writer周围,例如FileWriters和OutputStreamWriters.例如,

 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
Run Code Online (Sandbox Code Playgroud)

将PrintWriter的输出缓冲到文件.如果没有缓冲,每次调用print()方法都会导致字符转换为字节,然后立即写入文件,这可能效率很低.

你可以从中理解a BufferedWriter是一种写东西的有效方法.

将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串.

一个FileWriter对象被传递给,BufferedWriter因为这里的目的是使用a写入一些输出文件BufferedWriter.

最后,a PrintWriter用于print*类似的方法println().