19

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

6 回答 6

27

大概他们使用 a 是FileWriter因为他们想写入文件。两者BufferedWriterPrintWriter必须给另一个作家写信——你需要一些最终的目的地。

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

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

至于PrintWriter- 的使用,它暴露了一些额外的方法,例如println. 就我个人而言,我不喜欢它,因为它会吞下异常(您必须使用 明确检查checkError,它仍然没有提供详细信息,而且我认为我从未见过使用过),但这又取决于您在做什么。被PrintWriter传递BufferedWriter作为它的目的地。

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

于 2013-04-04T05:51:41.160 回答
8

文档

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

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

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

你可以从中了解到,aBufferedWriter是一种高效的写东西的方式。

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

将一个FileWriter对象传递给 ,BufferedWriter因为这里的目的是使用BufferedWriter.

最后,aPrintWriter用于.print*println()

于 2013-04-04T05:52:18.727 回答
3

PrintWriter 从这里

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

从上面的陈述看来,使用 PrintWriter 的主要原因是为了获得PrintStreamlikeprintln()等所有方法的访问权限println(char [] x)

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

FileWriter 从这里

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

.

于 2013-04-04T06:44:16.297 回答
2

FileWriter只是编写纯文本(不带格式),它不使用任何缓冲区机制,无论它以何种方式写入。

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

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

于 2013-04-04T05:50:17.607 回答
1

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

于 2013-04-04T05:50:00.157 回答
0

对象按此顺序包装,因为您想使用最外层的 PrintWriter 进行更复杂的格式化。BufferedWriter 必须包裹在某些东西上。因此,FileWriter 是 BufferedWriter 包装的,并且是最里面的对象。

于 2013-04-04T05:56:45.733 回答