❤️ 个人主页: 水滴技术
🚀 支持水滴: 点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏: Java 教程:从入门到精通
大家好,我是水滴~~
缓冲流是一个包装流,在创建缓冲流实例时,需要传入底层真实操作的输入或输出流。其主要的作用就是为了提高读写效率而生的。
今天讲的字节缓冲流有两个:BufferedInputStream
(字节缓冲输入流)和 BufferedOutputStream
(字节缓冲输出流)。本文会介绍它们的构造函数和一些常用方法,最后使用真实案例来看下字节缓冲流是如何使用的。
BufferedInputStream(字节缓冲输入流)
BufferedInputStream
是 InputStream
的包装流,用于缓冲字节输入流,不必在每个字节读取时都要进行系统底层调用,提高了读取效率。当创建 BufferedInputStream
实例时,会创建一个内部缓冲区数组,用于暂时存储从流中读取的数据。而在读取缓冲流时,会从该数组中读取,读完后会重新填充,直到流中的数据被全部读完。
构造函数
字节缓冲输入流的构造函数需要传入一个字节输入流,该字节输入流为实际读取的流对象。
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream
实例,并创建一个默认大小的缓冲区数组。输入流 in
为实际读取的流对象。
BufferedInputStream(InputStream in, int size)
创建一个 BufferedInputStream
实例,并创建一个指定大小的缓冲区数组。输入流 in
为实际读取的流对象。
常用方法
int read()
从字节缓冲区输入流中读取一个字节,将读取的字节以
int
型返回,如果读取至末尾,则返回值 -1 。
int read(byte b[])
从字节缓冲区输入流中读取多个字节,并将它们存储至自定义的字节数组b
中。读取的字节数最多等于b
的长度,也可以读取比b
长度小的字节数。返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。
int read(byte b[], int off, int len)
从字节缓冲区输入流中读取len
个字节,并从自定义的字节数组b
的off
下标处开始存储(即读取的第一个字节存入缓b[off]
中,下一个字节存入b[off + 1]
中...)。同样返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。
int available()
返回输入流中可读取的有效字节数。
void close()
关闭输入流,并释放与之相关的所有系统资源。
读取案例
这里只介绍如何使用缓冲区输入流来包装底层输入流的,更多的读取操作与其他字节输入流一至,你可以参考前面的《【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)》,这里就不再赘述了。
值得注意的是关闭流,这里只关闭缓冲区输入流即可,它会同时关闭底层的输入流
案例一:使用字节缓冲输入流读取文件
首先创建一个文件字节输入流fis
,再创建一个字节缓冲输入流bis
,底层字节输入流使用fis
。
然后就开始读取文件中的内容,其他读取方法与字节输入流的相同。
最后关闭流,这里只关闭缓冲区输入流bis
即可,它会同时关闭底层的输入流fis
。
代码示例:
public static void read1() throws IOException {
// 创建一个文件字节输入流 FileInputStream
FileInputStream fis = new FileInputStream("c:/io/11.txt");
// 创建一个缓冲输入流 BufferedInputStream 实例,底层输入流使用 FileInputStream
BufferedInputStream bis = new BufferedInputStream(fis);
// 读取一个字节
System.out.println((char) bis.read());
// 读取一个字节
System.out.println((char) bis.read());
// 读取一个字节
System.out.println((char) bis.read());
// 关闭缓冲输入流,会同时关闭底层输入流 FileInputStream
bis.close();
}
输出结果:
a
b
c
BufferedOutputStream(字节缓冲输出流)
BufferedOutputStream
是 OutputStream
的包装流,用于缓冲字节输出流,不必在每个字节写入时都要进行系统底层调用,提高了写入效率。当创建 BufferedOutputStream
实例时,会创建一个内部缓冲区数组,用于暂时存储从内存中写入的数据。缓冲区被填充满,会刷新缓冲区,进行真正的写入操作。
构造函数
字节缓冲输出流的构造函数需要传入一个字节输出流,该字节输出流为实际要写入的流对象。
BufferedOutputStream(OutputStream out)
创建一个BufferedOutputStream
实例,并创建一个默认大小的缓冲区数组。输出流out
为实际写入的流对象。
BufferedOutputStream(OutputStream out, int size)
创建一个BufferedOutputStream
实例,并创建一个指定大小的缓冲区数组。输出流out
为实际写入的流对象。
常用方法
void write(int b)
向字节缓冲区输出流中写入一个字节。
void write(byte b[], int off, int len)
向字节缓冲区输出流中写入多个字节,从缓存区b
的off
下标处开始写入len
个字节。
void flush()
刷新该输出流,强制将缓存区中的字节写入底层输出流。
写入案例
案例一:使用字节缓冲区向文件写入内容
首先创建一个文件字节输出流fos
,再创建一个字节缓冲输出流bos
,底层字节输出流使用fos
。
然后就开始向文件写入内容。
最后关闭流,这里只关闭缓冲区输出流bos
即可,它会同时关闭底层的输出流fos
。
代码示例:
public static void write1() throws IOException {
// 创建一个文件输出流 FileOutputStream
FileOutputStream fos = new FileOutputStream("c:/io/12.txt");
// 创建一个缓冲区输出流 BufferedOutputStream,底层输出流使用 FileOutputStream
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 写入一个字节(a)
bos.write(97);
// 写入一个字节(b)
bos.write(98);
// 写入一个字节(c)
bos.write(99);
// 关闭输出流,只关闭缓冲区输出流即可,会同时关闭底层输出流
bos.close();
}
执行代码后,会在磁盘中创建 c:/io/12.txt
文件,并写入内容:abc
系列文章
🔥 【Java I/O 流】文件的操作——java.io.File 类详解
🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream
🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)
🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer
🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
精品专栏
👍 《 Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》