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
因为他们想要写入文件。 必须给BufferedWriter
和PrintWriter
写入另一个写入程序 – 您需要一些最终目标。
(我个人不喜欢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
有一些有用的print
和println
方法,这些方法很方便。 直接使用FileWriter
,您将不得不使用更“低级”的API。 正如你所说BufferedWriter
是关于缓冲的。 所以它基本上是你要输出到文件的内容,以及你喜欢的抽象级别。
FileWriter
只是简单地编写纯文本(没有格式化)它不使用任何缓冲机制,无论它只是写它的方式。
BufferedWriter
是Writer
类的包装器,允许它使用缓冲区function(优化IO)。
PrintWriter
打印格式化文本,你可以提供格式字符串以及要打印的数据,虽然它可以直接使用任何Writer/OutputStream
,只是为了提供缓冲, Writer/OutputStream
首先传递给BufferedWriter
然后将格式化文本传递给PrintWriter
对象按此顺序包装,因为您希望使用最外面的PrintWriter进行更复杂的格式化。 BufferedWriter必须包装好。 因此,FileWriter就是BufferedWriter包装的内容,也是最里面的对象。