到目前为止,我们看到的大多数示例都使用无缓冲的 I / O(unbuffered I/O)。这意味着每个读取或写入请求均由基础操作系统直接处理。由于每个这样的请求通常会触发磁盘访问,网络活动或其他相对昂贵的操作,因此这可能会使程序的效率大大降低。
为了减少这种开销,Java平台实现了缓冲的 I / O流( buffered I/O streams)。缓冲的输入流从称为缓冲区(buffer的存储区中读取数据;仅当缓冲区为空时才调用本机输入API。同样,缓冲的输出流将数据写入缓冲区,并且仅在缓冲区已满时才调用本机输出API。
程序可以使用我们多次使用的包装习惯将未缓冲的流转换为缓冲的流,其中将未缓冲的流对象传递给缓冲流类的构造器。在CopyCharacters示例中,您可以通过以下方式修改构造器调用以使用缓冲的I / O:

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

还有用于包装缓冲流的4个缓冲流类: BufferedInputStreamBufferedOutputStream创建缓冲字节流,而 BufferedReaderBufferedWriter创建缓冲字符流。

刷新缓冲流

通常,在关键点写出缓冲区而不必等待缓冲区填充就很有意义。这称为刷新缓冲区(**flushing the buffer)**
一些缓冲的输出类支持自动刷新(autoflush,由可选的构造器参数指定。启用自动刷新后,某些关键事件会导致缓冲区被刷新。例如,一个自动刷新PrintWriter对象在每次调用printlnformat时都会刷新缓冲区。 有关这些方法的更多信息,请参见格式化
要手动刷新流,请调用其flush方法。flush方法对任何输出流均有效,但是除非对该流进行缓冲,否则该方法无效。