到目前为止,咱们看到的大多数示例都使用无缓冲的I/O,这意味着每一个读取或写入请求都由底层操做系统直接处理,这能够使程序效率低得多,由于每一个这样的请求一般触发磁盘访问、网络活动或一些相对昂贵的其余操做。html
为了减小这种开销,Java平台实现了缓冲的I/O流,缓冲输入流从称为缓冲区的内存区读取数据,仅当缓冲区为空时才调用原生输入API,相似地,缓冲输出流将数据写入缓冲区,而且仅在缓冲区已满时才调用原生输出API。java
程序能够使用咱们如今屡次使用的包装习惯用法将无缓冲的流转换为缓冲流,将无缓冲的流对象传递给缓冲流类的构造函数,如下是如何修改CopyCharacters
示例中的构造函数调用以使用缓冲I/O:segmentfault
inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
有四个用于包装无缓冲流的缓冲流类:BufferedInputStream和BufferedOutputStream建立缓冲的字节流,而BufferedReader和BufferedWriter建立缓冲的字符流。api
在关键点写出缓冲区一般是有意义的,而不是等待它被填满,这称为冲洗缓冲区。网络
一些缓冲的输出类支持autoflush
,由可选的构造函数参数指定,启用autoflush
时,某些关键事件会致使冲洗缓冲区。例如,自动冲洗PrintWriter
对象在每次调用println
或format
时冲洗缓冲区,有关这些方法的更多信息,请参阅格式化。oracle
要手动冲洗流,请调用其flush
方法,flush
方法在任何输出流上都有效,但除非流被缓冲,不然无效果。函数