目录
一、源自何方?缘何而起?
在利用字节流读写数据时默认方法为一个字节一个字节的读写,这样读写的次数明显增多,使得效率大大下降,并且平凡的读写对磁盘也不友好,所以为了提高读写的效率就诞生了缓冲流。
那么什么是缓冲流呢?想必小伙伴都知道利用字节流写数据时是可以写入一个数组,读数据时也可以一次读取一个字节数组,此种方法可以在一定程度上提高流的读写速率(具体比较结果可以参考:【Java】I/O流之字节流),并且差距可以达到一千倍之多。而字节缓冲流简单来说就是在字节流的基础上封装内置了一个缓冲区,该缓冲区就是一个字节数组,默认大小为8192字节(即8k),写(读)字节时,先将字节写(读)入缓冲区,当缓冲区写(读)满时,在一次性的将数据写(读)到文件里。这样就降低了写(读)的次数,提高了效率。
二、基本使用方法
字节缓冲流的使用方法与字节流的使用方法基本一致(可参考【Java】I/O流之字节流),其主要区别就在于字节缓冲流内部封装了一个字节数组,因此在创建对象时要先创建字节流,再创建字节缓冲流对字节流进行封装(字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作)。
1. 字节缓冲输入流
(1)创建对象
FileInputStream fis = new FileInputStream("fos.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
(2)基本使用方法
//一次提取一个字节
int by;
while((by = bis.read()) != -1) {
System.out.println((char)by);
}
//一次读取一个字节数组的数据
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1) {
System.out.print(new String(bys,0,len));
}
注意:以上两种读取方法在同一个数据流中只能只用一种。
2. 字节缓冲输出流
ileOutputStream fos = new FileOutputStream("fos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//写数据
bos.write("Holle!".getBytes());
//释放资源
bos.close();
3. 完整代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 字节缓冲流:默认缓冲区大小为8192字节
*
* 字节缓冲流:
* (1)BufferOutputStream:该类实现缓冲输出流。
* 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
* (2)BufferedlnputStream:创建Bufferedlnputstream将创建一个内部缓冲区数组。
* 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充。一次很多字节
*
* 构造方法:
* (1)字节缓冲输出流:BufferedOutputStream(OutputStream out)
* (2)字节缓冲输入流:BufferedInputStream(InputStream in)
*
* 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
* 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
*
*/
public class ByteStream_Buffered {
public static void main(String[] args) throws IOException {
output();
input();
}
public static void output() throws IOException {
FileOutputStream fos = new FileOutputStream("fos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//写数据
bos.write("Holle!".getBytes());
//释放资源
bos.close();
}
public static void input() throws IOException{
FileInputStream fis = new FileInputStream("fos.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
//一次提取一个字节
// int by;
// while((by = bis.read()) != -1) {
// System.out.println((char)by);
// }
//一次读取一个字节数组的数据
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1) {
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
}
}
三、小结
注意在字节缓冲流和字节流中都有一次读一个字节和一次读一个字节数组两种方法,那么他们的区别是什么呢?
在字节流中是读取一个字节(或一个字节数组)就写入磁盘一次,而字节缓冲流中虽然也是一次读取一个字节(或一个字节数组),但是要读够缓冲区大小的字节数后才写入磁盘一次。
因此缓冲区减少了读写磁盘的次数,从而提高了效率。