FileWriter和BufferedWriter之间的Java差异

Opi*_*Opi 66 java file-io java-io

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

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();
Run Code Online (Sandbox Code Playgroud)

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rey 81

如果你的话,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);
 }
Run Code Online (Sandbox Code Playgroud)

这使得一次系统调用,每次调用write(String).


BufferedWriter提高效率的地方是多次小写.

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

如果没有BufferedWriter,这可能会使200(2*100)次系统调用和写入磁盘效率低下.使用BufferedWriter,这些都可以缓冲在一起,并且默认缓冲区大小为8192个字符,这只是一个系统调用写入.

  • 好吧,也许 10 年前就是这样,但至少在 Java 11 中,`FileWriter` 扩展了 `OutputStreamWriter`,后者使用了 `StreamEncoder`,后者又拥有自己的内部 8KB 缓冲区(原因与BufferedWriter,但它仍然是一个缓冲区)。因此,您可能不会像调用“write()”那样多次写入磁盘 (2认同)

Ale*_*exR 8

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

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

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


RNJ*_*RNJ 5

BufferedWriter 效率更高。如果内存正确地为我服务,它会保存小的写入并写入一个更大的块。如果您要进行大量小写操作,那么我将使用 BufferedWriter。向操作系统调用写调用,这很慢,因此通常需要尽可能少的写操作。