文档

Java™教程
隐藏目录
缓冲流
教程:Java基础类
课程:基本I/O
章节:I/O流

缓冲流

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

为了减少这种开销,Java平台实现了缓冲输入/输出流。缓冲输入流从称为缓冲区的内存区域中读取数据;只有在缓冲区为空时才调用本机输入API。类似地,缓冲输出流将数据写入缓冲区,只有在缓冲区满时才调用本机输出API。

程序可以使用我们已经多次使用过的封装方法将非缓冲流转换为缓冲流,其中非缓冲流对象传递给缓冲流类的构造函数。以下是如何修改CopyCharacters示例中的构造函数调用以使用缓冲I/O的方式:

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

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

刷新缓冲流

在关键点写出缓冲区内容而不等待缓冲区填满通常是有意义的。这被称为刷新缓冲区。

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

要手动刷新流,请调用其flush方法。flush方法在任何输出流上都有效,但仅当流具有缓冲时才会产生效果。


上一页: 字符流
下一页: 扫描和格式化