Buffered Streams

到目前为止,我们看到的大多数示例都使用无缓冲的 I/O。这意味着每个读取或写入请求均由基础 OS 直接处理。由于每个此类请求通常会触发磁盘访问,网络活动或其他相对昂贵的操作,因此这可能会使程序的效率大大降低。

为了减少这种开销,Java 平台实现了缓冲的 I/O 流。缓冲的 Importing 流从称为缓冲区的存储区读取数据;仅当缓冲区为空时才调用本机 ImportingAPI。同样,缓冲的输出流将数据写入缓冲区,并且仅在缓冲区已满时才调用本机输出 API。

程序可以使用我们已经多次使用的包装习惯将未缓冲的流转换为缓冲的流,其中将未缓冲的流对象传递给缓冲流类的构造函数。您可以按照以下方法修改CopyCharacters示例中的构造函数调用以使用缓冲的 I/O:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

有四种用于包装非缓冲流的缓冲流类:BufferedInputStreamBufferedOutputStream创建缓冲的字节流,而BufferedReaderBufferedWriter创建缓冲的字符流。

刷新缓冲的流

通常,在关键点写出缓冲区而不必 await 缓冲区填充就很有意义。这称为刷新缓冲区。

一些缓冲的输出类支持自动刷新,该刷新由可选的构造函数参数指定。启用自动刷新后,某些键事件会导致缓冲区被刷新。例如,每次printlnformat调用时,自动刷新PrintWriter对象都会刷新缓冲区。有关这些方法的更多信息,请参见Formatting

要手动刷新流,请调用其flush方法。 flush方法对任何输出流均有效,但除非对该流进行缓冲,否则它无效。