天天看点

java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例

本章内容包括3个部分:BufferedOutputStream介绍,BufferedOutputStream源码,以及BufferedOutputStream使用示例。

BufferedOutputStream 是缓冲输出流。它继承于FilterOutputStream。

BufferedOutputStream 的作用是为另一个输出流提供“缓冲功能”。

BufferedOutputStream 函数列表

java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例
java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例
java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例
java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例

说明:

BufferedOutputStream

的源码非常简单,这里就BufferedOutputStream的思想进行简单说明:BufferedOutputStream通过字节数组来缓冲数

据,当缓冲区满或者用户调用flush()函数时,它就会将缓冲区的数据写入到输出流中。

关于BufferedOutputStream中API的详细用法,参考示例代码(BufferedOutputStreamTest.java):

java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例
java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例

运行结果:

生成文件“out.txt”,文件的内容是“abcdefghij”。

分步测试:

分别按照下面3种步骤测试程序,来查看缓冲区大小以及flush()的作用。

第1种:原始程序。

(01) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为空。

(02) 运行程序。在用户输入之后,查看“out.txt”的文本内容;发现:内容为“abcdefghij”。

从中,我们发现(01)和(02)的结果不同;之所以(01)中的out.txt内容为空,是因为out.txt对应的缓冲区大小是16字节,而我们只写入了11个字节,所以,它不会执行清空缓冲操作(即,将缓冲数据写入到输出流中)。

而(02)对应out.txt的内容是“abcdefghij”,是因为执行了out.close(),它会关闭输出流;在关闭输出流之前,会将缓冲区的数据写入到输出流中。

注意:重新测试时,要先删除out.txt。

第2种:在readUserInput()前添加如下语句,

这句话的作用,是将“缓冲区的内容”写入到输出流中。

(01) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为“abcdefghij”。

从中,我们发现(01)和(02)结果一样,对应out.txt的内容都是“abcdefghij”。这是因为执行了flush()操作,它的作用是将缓冲区的数据写入到输出流中。

注意:重新测试时,要先删除out.txt!

第3种:在第1种的基础上,将

修改为

(01) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为“abcdefghijklmnopqrst”(不含回车)。

(02) 运行程序。在用户输入之后,查看“out.txt”的文本内容;发现:内容为“abcdefghijklmnopqrst”(含回车)。

中,我们发现(01)运行结果是“abcdefghijklmnopqrst”(不含回车)。这是因为,缓冲区的大小是16,而我们通过

out.write(ArrayLetters, 0,

20)写入了20个字节,超过了缓冲区的大小;这时,会直接将全部的输入都写入都输出流中,而不经过缓冲区。

(02)运行结果是“abcdefghijklmnopqrst”(含回车),这是因为执行out.close()时,将回车符号'\n'写入了输出流中。