【问题标题】:In Java, what is the difference between using a BufferedWriter or writing straight to file? [duplicate]在 Java 中,使用 BufferedWriter 或直接写入文件有什么区别? [复制]
【发布时间】:2011-11-23 07:48:10
【问题描述】:
【问题讨论】:
标签:
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),即磁盘旋转和寻找正确扇区所需的时间。
此外,将小的写入聚合到一个较大的写入中可以减少操作系统的开销,从而获得更好的性能。
大多数操作系统都有一个内部缓冲区来缓存写入。然而,这些缓存试图通过分析写入模式来弄清楚应用程序在做什么。如果应用程序本身能够执行缓存,并且仅在数据准备好时执行写入,则结果(在性能方面)会更好。