好的,我正在学习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);
答案 0 :(得分:24)
据推测,他们正在使用FileWriter
,因为他们想要写入文件。必须为BufferedWriter
和PrintWriter
提供另一位作者才能写入 - 您需要某些最终目的地。
(我个人不喜欢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
只是写纯文本(没有格式化)它不使用任何缓冲机制,无论它只是写它的方式。
BufferedWriter
是Writer
类的包装器,允许它使用缓冲区功能(优化IO)。
PrintWriter
打印格式化文本,您可以提供格式字符串以及要打印的数据,但它可以直接使用任何Writer/OutputStream
,只是为了提供缓冲,Writer/OutputStream
是第1个传递给BufferedWriter
然后将格式化文本传递给PrintWriter
答案 3 :(得分:2)
来自here
的PrintWriter将对象的格式化表示形式打印到文本输出流。 此类实现PrintStream中的所有打印方法。 它不包含用于编写程序的原始字节的方法 应该使用未编码的字节流。
从上面的陈述中看来,使用PrintWriter的主要原因似乎是获取PrintStream
的所有方法的访问权限,例如println()
,println(char [] x)
等。
BufferedWriter,你是对的这是写入文件的最佳方式之一,因为它会在直接写入文件之前将字符缓冲到虚拟内存中,并提出newLine()
方法。
FileWriter用于编写字符流。写作 原始字节流,请考虑使用FileOutputStream
答案 4 :(得分:1)
通常,这种Writer链接是关于抽象的。 PrintWriter
有一些有用的print
和println
方法,如果您想将字符串和行打印到文件中,这些方法很方便。直接使用FileWriter
,您将不得不使用更“低级”的API。正如你所说BufferedWriter
是关于缓冲的。所以它基本上是你要输出到文件的内容,以及你喜欢的抽象级别。
答案 5 :(得分:0)
对象按此顺序包装,因为您希望使用最外面的PrintWriter进行更复杂的格式化。 BufferedWriter必须包装好。因此,FileWriter就是BufferedWriter包装的内容,也是最里面的对象。