Java 在 FileWriter 和 BufferedWriter 之间的区别

2022-08-31 13:20:55

这两者之间有什么区别?我只是在学习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();

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


答案 1

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 个字符,因此只需编写 1 个系统调用即可。


答案 2

你是对的。以下是方法的外观: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;