繁体   English   中英

FileWrite BufferedWriter和PrintWriter相结合

[英]FileWrite BufferedWriter and PrintWriter combined

好的,我正在学习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);

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

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

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

至于PrintWriter的使用 - 那么,暴露了一些额外的方法,如println 我个人不喜欢它,因为它吞下异常(你必须明确检查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()

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

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

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

PrintWriter来自这里

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

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

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

FileWriter来自这里

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM