好了,所以我正在学习有关的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
,因为他们要写入文件。 双方BufferedWriter
和PrintWriter
都被赋予另一位作家写-你需要一些最终目的地。
(我个人不喜欢FileWriter
,因为它不会让你指定的编码方式。我喜欢用FileOutputStream
包裹在一个OutputStreamWriter
,但是这是一个不同的问题。)
BufferedWriter
用于缓冲,就像你说的-虽然它并不缓存所有的输出,只是它的一个固定量(缓冲区的大小)。 它创建“大块”写入底层作家。
至于使用的PrintWriter
-嗯,这暴露了一些额外的方法如println
。 我个人不喜欢它,因为它吞下异常(你必须有明确检查checkError
,仍然没有给出细节,我不认为我见过使用),但同样这取决于你在做什么。 该PrintWriter
是通过BufferedWriter
作为其目的地。
所以,你已经证明大概会写的部分代码如下PrintWriter
,这将写入BufferedWriter
,这将(当其缓冲区已满,或者它刷新或关闭)写信给FileWriter
,这将反过来转换字符数据到磁盘上的字节。
从文档 :
在一般情况下,一个Writer立即将其输出发送到基础字符或字节流。 除非要求提示输出,最好是环绕任何作家,写()操作可能是昂贵的,如FileWriters和OutputStreamWriters一个的BufferedWriter。 例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
将缓冲PrintWriter的输出到文件中。 如果没有缓冲,打印()方法的每一次调用会引起字符被转换为将被立即写入到文件的字节,它可以是非常低效的。
你可以从这个理解, BufferedWriter
是写东西的有效途径。
将文本写入字符输出流,缓冲字符,从而提供单个字符,数组和字符串的高效写入。
一个FileWriter
对象传递给BufferedWriter
这里的意图是写使用一些输出文件BufferedWriter
。
最后,一个PrintWriter
用于print*
方法,如println()
。
为PrintWriter从这里
打印格式化对象的表示到一个文本输出流。 这个类实现了全部在PrintStream中的印刷方法。 它不包含用于写入原始字节,对于这一个程序应使用未编码的字节流的方法。
从上面的语句似乎主要理由使用PrintWriter的是得到的所有方法访问PrintStream
类似println()
println(char [] x)
等。
但是BufferedWriter,你是对的它的写入一个文件,因为它会缓冲的字符到虚拟内存直接写入文件前,用想出最好的办法一个newLine()
方法。
FileWriter的从这里
FileWriter的是为写字符流。 对于写原始字节流,请考虑使用一个FileOutputStream
。
FileWriter
是简单地写纯文本(不带格式)它不使用任何缓冲机制,无论发生什么事,它只是写它的方式。
BufferedWriter
是包装为Writer
类,以允许其能够使用缓冲器的功能(用于优化IO)。
PrintWriter
打印格式的文本,您可以与数据一起提供的格式字符串,印刷,尽管它可以直接与任何合作Writer/OutputStream
,只需提供缓冲, Writer/OutputStream
是第一个传递到BufferedWriter
然后有格式化的文本被传递到PrintWriter
通常情况下,这类作家链大约是抽象。 PrintWriter
有一些有用的print
和println
方法,如果你想打印字符串和线到一个文件,可以很方便。 直接与工作FileWriter
,你将不得不使用更多的“低层次”的API。 正如你说BufferedWriter
约为缓冲。 所以基本上,你要输出到文件什么事,什么层次的抽象你喜欢。
因为你要使用的最外层的PrintWriter其更复杂的格式中的对象被包裹在这个顺序。 BufferedWriter将必须的东西包裹。 所以FileWriter的,因此,是什么的BufferedWriter包装并在最里面的对象。