缓冲流
到目前为止,我们看到的大多数示例都使用无缓冲的I/O,这意味着每个读取或写入请求都由底层操作系统直接处理,这可以使程序效率低得多,因为每个这样的请求通常触发磁盘访问、网络活动或一些相对昂贵的其他操作。
为了减少这种开销,Java平台实现了缓冲的I/O流,缓冲输入流从称为缓冲区的内存区读取数据,仅当缓冲区为空时才调用原生输入API,类似地,缓冲输出流将数据写入缓冲区,并且仅在缓冲区已满时才调用原生输出API。
程序可以使用我们现在多次使用的包装习惯用法将无缓冲的流转换为缓冲流,将无缓冲的流对象传递给缓冲流类的构造函数,以下是如何修改CopyCharacters
示例中的构造函数调用以使用缓冲I/O:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
有四个用于包装无缓冲流的缓冲流类:BufferedInputStream和BufferedOutputStream创建缓冲的字节流,而BufferedReader和BufferedWriter创建缓冲的字符流。
冲洗缓冲流
在关键点写出缓冲区通常是有意义的,而不是等待它被填满,这称为冲洗缓冲区。
一些缓冲的输出类支持autoflush
,由可选的构造函数参数指定,启用autoflush
时,某些关键事件会导致冲洗缓冲区。例如,自动冲洗PrintWriter
对象在每次调用println
或format
时冲洗缓冲区,有关这些方法的更多信息,请参阅格式化。
要手动冲洗流,请调用其flush
方法,flush
方法在任何输出流上都有效,但除非流被缓冲,否则无效果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。