FileWrite BufferedWriter和PrintWriter相结合

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

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

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

据推测,他们正在使用FileWriter因为他们想要写入文件。 必须给BufferedWriterPrintWriter写入另一个写入程序 – 您需要一些最终目标。

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

正如你所说的那样, BufferedWriter用于缓冲 – 虽然它不会缓冲所有输出,只是它的固定量(缓冲区的大小)。 它为底层作者创建了“更大”的写作。

至于PrintWriter的使用 – 那么,暴露了一些额外的方法,如println 。 我个人不喜欢它,因为它吞下exception(你必须明确检查checkError ,它仍然没有提供详细信息,我认为我没见过),但这又取决于你在做什么。 PrintWriter作为目标传递给BufferedWriter

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

来自Docs :

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

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

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

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

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

FileWriter对象被传递给BufferedWriter因为这里的目的是使用BufferedWriter写入某个输出文件。

最后, PrintWriter用于print*方法,如println()

PrintWriter来自这里

将对象的格式化表示打印到文本输出流。 此类实现PrintStream中的所有打印方法。 它不包含写入原始字节的方法,程序应使用未编码的字节流。

从上面的陈述看,使用PrintWriter的主要原因似乎是获取PrintStream的所有方法的访问权限,如println()println(char [] x)等。

BufferedWriter,你是对的它是写入文件的最好方法之一,因为它会在直接写入文件之前将字符缓冲到虚拟内存中并提出newLine()方法。

FileWriter来自这里

FileWriter用于编写字符流。 要编写原始字节流,请考虑使用FileOutputStream

通常,这种Writer链接是关于抽象的。 如果要将字符串和行打印到文件, PrintWriter有一些有用的printprintln方法,这些方法很方便。 直接使用FileWriter ,您将不得不使用更“低级”的API。 正如你所说BufferedWriter是关于缓冲的。 所以它基本上是你要输出到文件的内容,以及你喜欢的抽象级别。

FileWriter只是简单地编写纯文本(没有格式化)它不使用任何缓冲机制,无论它只是写它的方式。

BufferedWriterWriter类的包装器,允许它使用缓冲区function(优化IO)。

PrintWriter打印格式化文本,你可以提供格式字符串以及要打印的数据,虽然它可以直接使用任何Writer/OutputStream ,只是为了提供缓冲, Writer/OutputStream首先传递给BufferedWriter然后将格式化文本传递给PrintWriter

对象按此顺序包装,因为您希望使用最外面的PrintWriter进行更复杂的格式化。 BufferedWriter必须包装好。 因此,FileWriter就是BufferedWriter包装的内容,也是最里面的对象。