【环境】
jdk1.8
前面学习过 BufferedReader,是缓冲字符输入流。那么今天来学习对应的缓冲字符输出流类:BufferedWriter。跟 BufferedReader 同理,它也是一个包装类,需要提供目标输出流。
1. 注释解释
Writes text to a character-output stream, buffering characters so as to provide for the efficient writing of single characters, arrays, and strings.
写文本到字符输出流,通过缓冲字符以提供对单个字符、数组和字符串的高效输出。
2. 定义和构造
先看看源码
private static int
3. 核心方法
3.1. 因为该类也是输出流一族,所以先来看看必不可少的 write 方法们:
3.2. 从几个 write 方法可以看出,真正将数据写入输出流的就是 flushBuffer 方法了:
3.3. 另外,跟其它输出流一样,BufferedWriter 也提供了 flush 方法:
如上图所提问的,既然已经调用了 flushBuffer() 方法,为什么还要调用 flush 方法呢?
咋一看好像是多余,其实仔细想想就明白了:flushBuffer() 只是将当前这个缓冲输出流的缓冲区清空;而 flush() 方法是整个输出流家族的一个约定方法,目的是将数据强制输出到目标地,它的行为目标就是要将数据输出到最终的目的地(就算是有阻塞,那也是操作系统的事情了,对于java程序而言能做的都做了,flush 已经尽了最大努力)。想想假如被当前缓冲流包装的仍然是一个缓冲流类(类似于多级缓冲),那么如果只调用 flushBuffer 的话,就只是把数据推到下一级缓冲区,并不能达到 flush 方法约定的功能目的。
3.4. 再提一下 close() 方法
4. 总结
BufferedWriter 是缓冲字符输出流类,当有数据需要输出时,会优先保存在缓冲区,缓冲区满的时候,自动输出到被包装流。如果单次需要输出的数据过大(大于缓冲区大小),则不会使用缓冲区,会先强刷清空缓冲区,再直接输出本次需要输出的数据。