【问题标题】:Buffer in FileWriter and BufferedWriterFileWriter 和 BufferedWriter 中的缓冲区
【发布时间】:2019-06-08 11:58:57
【问题描述】:

FileWriter的api是这样开头的:

“使用默认的缓冲区大小将文本写入字符文件。”

BufferedWriter的api是这样开头的:

“将文本写入字符输出流,缓冲个字符[...]”

所以,显然这两个类都在使用缓冲区。遗憾的是,该 api 并没有解释这两种缓冲区之间的区别。

所以,我问自己:区别在哪里?

【问题讨论】:

  • 区别不在于缓冲区的种类。它在类的使用中。看看类构造函数和可能性。
  • 除了一个写给File和一个写给stream吗?
  • @MadPhysicist - 两者都是作家,因此写入字符,而不是字节。

标签: java filewriter bufferedwriter


【解决方案1】:

当您有多个写入时,BufferedWriter 效率更高。它保存了小写入并在一个大块中写入。下面是 BufferedWriter 的 write() 方法,它检查缓冲区是否已满if (nextChar >= nChars) 并刷新缓冲区。

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

对于 FileWriter,每次写入都会进行一次系统调用,而 BufferedWriter 会在缓冲区满后进行系统调用。所以如果你有多个小写,BufferedWriter 会更有效率。

【讨论】:

  • 真的吗?你检查过来源吗?
【解决方案2】:

BufferedWriter 的缓冲区写入实现比FileWriter 更好,性能方面

除非需要即时输出,否则建议将 BufferedWriter 包裹在任何 write() 操作可能成本高昂的 Writer 周围,例如 FileWriters 和 OutputStreamWriters。例如,

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

对于缓冲FileWriter 正在扩展OutputStreamWriter,它也指向使用BufferedWriter

为了获得最高效率,请考虑将 OutputStreamWriter 包装在 BufferedWriter 中以避免频繁的转换器调用。

【讨论】:

  • 坦率地说,我认为文档实际上与来源相矛盾。 OutputStreamWriter 的源包含一个字符缓冲区,只有在它已满时才会转换。
  • @RealSkeptic 在实现中,我查了一下,它只有一个字节缓冲区来保存编码的内容。尽管如此,它会减少实际 I/O 操作的数量,并且在编写器端有另一个字符缓冲区不会改善这一点。关于文档,“避免频繁的转换器调用”将导致“最高效率”的假设通常是有缺陷的,就像java.io 包中几乎所有关于缓冲的声明一样。这有着悠久的传统。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2018-04-16
相关资源
最近更新 更多