FileWrite BufferedWriter和PrintWriter相结合

时间:2013-04-04 05:42:06

标签: java filewriter printwriter bufferedwriter

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

6 个答案:

答案 0 :(得分:24)

据推测,他们正在使用FileWriter,因为他们想要写入文件。必须为BufferedWriterPrintWriter提供另一位作者才能写入 - 您需要某些最终目的地。

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

正如你所说,

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

关于PrintWriter的使用 - 好吧,这会暴露一些额外的方法,例如println。我个人不喜欢它,因为它吞下了异常(你必须明确检查checkError,它仍然没有提供详细信息,我认为我曾经看不到使用的) ,但这又取决于你在做什么。 PrintWriter作为 目的地传递给BufferedWriter

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

答案 1 :(得分:6)

来自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()方法。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

来自here

的PrintWriter
  

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

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

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

here

中的FileWriter
  

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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