FileWriter和BufferedWriter之间的Java差异

这些有什么区别? 我只是学习Java的ATM,但似乎我可以写入文件两种方式,即(我没有复制try-catch块在这里)

FileWriter file = new FileWriter("foo.txt"); file.write("foobar"); file.close(); 

 FileWriter file = new FileWriter("foo.txt"); BufferedWriter bf = new BufferedWriter(file); bf.write("foobar"); bf.close(); 

我首先理解缓冲数据的概念,那么这是否意味着第一个例子逐个写入字符,第二个缓冲数据首先缓冲到内存并写入一次?

谢谢您的帮助

如果你使用BufferedWriter,效率会更高

  • 在刷新/closures之间有多个写入
  • 写入与缓冲区大小相比较小。

在你的例子中,你只有一个写,所以BufferedWriter只是增加你不需要的开销。

所以这意味着第一个例子逐个写入字符,第二个例子首先将它caching到内存中并写入一次

在这两种情况下,string都是一次写入的。

如果你只使用FileWriter,你的write(String)调用

  public void write(String str, int off, int len) // some code str.getChars(off, (off + len), cbuf, 0); write(cbuf, 0, len); } 

这使得一个系统调用,每个调用写(String)。


BufferedWriter提高效率的地方在于多处小写。

 for(int i = 0; i < 100; i++) { writer.write("foorbar"); writer.write(NEW_LINE); } writer.close(); 

如果没有BufferedWriter,可能会产生200(2 * 100)个系统调用并写入磁盘,效率低下。 使用BufferedWriter,这些可以全部缓冲在一起,并且由于默认缓冲区大小为8192个字符,所以这成为仅仅1个系统调用来写入。

你是对的。 以下是BufferedWriter write()方法的外观:

 public void write(int c) throws IOException { synchronized (lock) { ensureOpen(); if (nextChar >= nChars) flushBuffer(); cb[nextChar++] = (char) c; } } 

正如你所看到的,它确实检查缓冲区是否已满( if (nextChar >= nChars) )并刷新缓冲区。 然后它将新的字符添加到缓冲区( cb[nextChar++] = (char) c; )。

BufferedWriter更高效。 如果内存正确地为我提供服务,它将节省小写入和写入一个更大的块。 如果你正在做很多小写,然后我会使用BufferedWriter。 调用写入调用的操作系统是缓慢的,所以尽可能less的写入通常是可取的。

从Java API规范:

的FileWriter

写字符文件的便利课程。 此类的构造函数假定默认的字符编码和默认的字节缓冲区大小是可以接受的。

但是BufferedWriter

将文本写入字符输出stream,缓冲字符以提供单个字符,数组和string的高效写入。

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

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

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(“foo.out”)));

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