FileWrite BufferedWriter 和 PrintWriter 组合

好的,所以我正在学习I / O,我在其中一张幻灯片中找到以下代码。有人可以解释为什么需要FileWrite,BufferedWriter和PrintWriter吗?我知道BufferedWriter是缓冲输出并一次全部放置,但是为什么他们会使用FileWriter和PrintWriter?他们不是在错误处理等方面做了同样的事情吗?

还有为什么它们会传递给?bwPrintWriter

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);

答案 1

据推测,他们正在使用 ,因为他们想要写入文件。两者都必须给另一个作家写信 - 你需要一些最终的目的地。FileWriterBufferedWriterPrintWriter

(就个人而言,我不喜欢它,因为它不允许您指定编码。我更喜欢使用 wrappeed in a ,但这是另一回事。FileWriterFileOutputStreamOutputStreamWriter

BufferedWriter用于缓冲,如您所说 - 尽管它不缓冲所有输出,只是固定数量的输出(缓冲区的大小)。它创建“块状”写入基础编写器。

至于使用 -嗯,这暴露了一些额外的方法,例如.就个人而言,我不喜欢它,因为它吞下了异常(你必须明确检查,这仍然没有给出细节,我认为我从未见过使用过),但同样这取决于你在做什么。将 传递 作为其目标。PrintWriterprintlncheckErrorPrintWriterBufferedWriter

因此,您显示的部分下面的代码大概会写入 ,它将写入 ,这将(当其缓冲区已满,或者它被刷新或关闭时)写入 ,这将反过来将字符数据转换为磁盘上的字节。PrintWriterBufferedWriterFileWriter


答案 2

来自文档

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

 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

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

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

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

将对象传递给 ,因为此处的方法是使用 写入某些输出文件。FileWriterBufferedWriterBufferedWriter

最后,a 用于诸如 .PrintWriterprint*println()


推荐