FileWriter和BufferedWriter之间的Java差异

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

那些有什么区别?我刚刚学习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更高效

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

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

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

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

如果你只使用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);
 }

这使得一次系统调用,每次调用写入(字符串)。

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

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

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

用户回答回答于

你是对的。以下是看起来如何的write()方法BufferedWriter

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;)。

扫码关注云+社区