在Java中,使用BufferedWriter和直接写入文件有什么区别?

在Java中,使用BufferedWriter和直接写入文件有什么区别?,java,file-io,bufferedwriter,Java,File Io,Bufferedwriter,可能重复: 我正在看的网站上说 BufferWriter类用于将文本写入字符输出流,缓冲字符,以便有效地写入单个字符、数组和字符串 是什么让它更高效?为什么?顾名思义,BufferedWriter使用缓冲区来降低写入成本。如果要写入文件,您可能知道写入1字节或写入4字节的成本大致相同。执行这种写入所需的时间主要由访问时间(~8ms)决定,这是磁盘旋转和寻找正确扇区所需的时间 此外,将较小的写入聚合到较大的写入中可以减少操作系统的开销,从而获得更好的性能 大多数操作系统都有一个内部缓冲区来缓存写

可能重复:

我正在看的网站上说

BufferWriter类用于将文本写入字符输出流,缓冲字符,以便有效地写入单个字符、数组和字符串


是什么让它更高效?为什么?

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

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


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

BufferedWriter会等待缓冲区(8192字节)已满,并在一次磁盘操作中写入整个缓冲区。无缓冲的每次写入都会导致磁盘I/O的成本明显更高。

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

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

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

现在这样做更有意义了。谢谢。谢谢你提供的刷新方法信息。我想可能是,但没有看其他问题。很抱歉。