【问题标题】:In Java, what is the difference between using a BufferedWriter or writing straight to file? [duplicate]在 Java 中,使用 BufferedWriter 或直接写入文件有什么区别? [复制]
【发布时间】:2011-11-23 07:48:10
【问题描述】:

可能重复:
In Java, what is the advantage of using BufferedWriter to append to a file?

我正在查看的网站说

“BufferWriter 类用于将文本写入字符输出流,缓冲字符,以提供单个字符、数组和字符串的高效写入。”

是什么让它更有效率?为什么?

【问题讨论】:

  • 我认为可能是,但没有看其他问题。对此感到抱歉。

标签: java file-io bufferedwriter


【解决方案1】:

BufferedWriter 更有效,因为它使用缓冲区而不是逐个字符地写入。因此它减少了磁盘的I/O 操作。数据收集在缓冲区中,并在缓冲区已满时写入文件。 这就是为什么如果你不调用 flush 方法,有时文件中没有数据写入的原因。也就是说,数据被收集在缓冲区中,但程序在将它们写入文件之前退出。即使缓冲区没有完全填满,调用flush 方法也会导致数据写入文件中。

【讨论】:

  • 感谢刷新方法信息。
【解决方案2】:

当您将逐个字符写入文件时,写入成本会变得昂贵。为了降低该成本,提供了缓冲器。如果您正在写入缓冲区,它会等待某个限制,然后将整个写入磁盘。

【讨论】:

    【解决方案3】:

    BufferedWriter 一直等到缓冲区(8192 字节)已满,并在一次磁盘操作中写入整个缓冲区。每次写入未缓冲会导致磁盘 I/O 显然更昂贵。

    【讨论】:

    • 现在更有意义了。谢谢。
    【解决方案4】:

    硬盘具有最小的信息存储单元,例如,如果您正在写入单个字节,则操作系统会要求磁盘存储一个存储单元(我认为最小值为 512 字节)。因此,您要求写入一个字节,而操作系统会写入更多。如果您要求在 512 次调用中存储 512 字节,那么您最终会执行更多的 I/O(512 次磁盘操作),而不是缓冲 512 字节并仅发出一次调用(1 次磁盘操作)。

    【讨论】:

      【解决方案5】:

      顾名思义,BufferedWriter 使用缓冲区来降低写入成本。如果您正在写入文件,您可能知道写入 1 字节或写入 4 字节的成本大致相同。执行此类写入所需的时间主要取决于访问时间(~8ms),即磁盘旋转和寻找正确扇区所需的时间。

      此外,将小的写入聚合到一个较大的写入中可以减少操作系统的开销,从而获得更好的性能。

      大多数操作系统都有一个内部缓冲区来缓存写入。然而,这些缓存试图通过分析写入模式来弄清楚应用程序在做什么。如果应用程序本身能够执行缓存,并且仅在数据准备好时执行写入,则结果(在性能方面)会更好。

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多