【问题标题】:FileWriter vs BufferedWriterFileWriter 与 BufferedWriter
【发布时间】:2013-07-27 19:10:25
【问题描述】:

我想知道 FileWriter 是否被缓冲。

this SO 问题中,似乎是这样,但是在this SO 问题中似乎不是。(这将是每次调用 write(..) 时的系统调用。

所以基本上阅读这两个问答我有点困惑。有人能解释清楚吗?

提前致谢。

编辑:通过阅读我引用了相关部分的this API 解决了问题:

每次调用 write() 方法都会导致编码转换器 在给定的字符上调用。结果字节是 在写入底层输出之前累积在缓冲区中 溪流。可以指定这个缓冲区的大小,但默认情况下是 对于大多数用途来说足够大。请注意,传递给 write() 方法没有缓冲。

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

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

由于 FileWriter 扩展了 OutputStreamWriter,它也适用于它。

感谢您抽出宝贵时间,我知道我问了一些非常具体的问题。

【问题讨论】:

    标签: java io buffer


    【解决方案1】:

    我建议始终使用 BufferedWriter。它允许您控制实际的缓冲区大小,并且可以保证无论您使用哪种 JVM,IO 都会被缓冲,从而带来巨大的 IO 性能提升。

    【讨论】:

    • 好的,但是 FileWriter 是缓冲的吗?它只有这个著名的标准字节缓冲区?它是如何工作的?是处理它的JVM吗?
    • 查看 JDK 1.7 代码显示 Writer 基类中有一个 writeBuffer。所以所有的作家都有这个缓冲区。 BufferedWriter 使用第二个缓冲区 private char cb[];这导致了这个隐藏缓冲区可能不是所有 JDK 实现的一部分的结论(android 呢?)
    • 没有。在 OutputStreamWriter 中重写了 write 方法。缓冲发生在 OutputStreamWriter 使用的 StreamEncoder 中,它将字符编码为字节。
    • 没错,OutputStreamWriter 覆盖了大部分的写入方法,并绕过了基类中的缓冲区。
    【解决方案2】:

    FileWriter 没有缓冲,您必须使用BufferedWriter 作为包装器:

    final int myBufferSize = 2048;
    
    Writer myWriter = new BufferedWriter(new FileWriter, myBufferSize);
    

    【讨论】:

    • 默认缓冲区大小如何?
    • 错了,FileWriter的api说:Writes text to character files using a default buffer size.
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2016-07-29
    • 2016-06-11
    • 1970-01-01
    • 2018-04-16
    • 2020-05-25
    相关资源
    最近更新 更多