缓冲流
1. 概述
缓冲流也被称作高效流。它是普通IO流的增强。
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小(8192KB)的缓冲区数组,一次性读取指定大小的内容到缓冲区数组中,以此减少IO的次数,提高效率。
2. 缓冲流的类型
- 字节缓冲流
- BufferedIntputStream
- BufferedOutputStream
- 字符缓冲流
- BufferedReader
- BufferedWriter
3. 字节缓冲流
3.1 字节缓冲输出流
java.io.BufferedOutputStream
构造方法:
- public BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
- public BufferedOutputStream(OutputStream out,int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
写方法与普通的输入输出流没有区别,需要使用flush或者close方法才能把数据从内存缓冲区写入指定目的地中
3.2 字节缓冲输入流
java.io.BufferedInputStream
构造方法:
- public BufferedInputStream(InputStream in) 创建一个新的缓冲输入流,以使用底层输入流读取数据
- public BufferedInputStream(InputStream in,int size) 创建一个新的缓冲输入流,以使用底层输入流将数据读取到指定大小的缓冲区中
读取方法与普通的输入输出流没有区别
4. 字符缓冲流
4.1 字符缓冲输出流
java.io.BufferedWriter
构造方法:
- public BufferedWriter(Writer out) 创建一个新的缓冲输出流
- public BufferedWriter(Writer out,int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
特有的成员方法:
- void newLine() 写入一个行分隔符,会根据不同的操作系统,获取不同的行分隔符。
4.2 字符缓冲输入流
java.io.BufferedReader
构造方法:
- public BufferedReader(Reader in) 创建一个新的缓冲输入流
- public BufferedReader(Reader in,int size) 创建一个新的缓冲输入流,以使用底层输入流将数据读取到指定大小的缓冲区中
特有的成员方法:
- String readLine() 读取一个文本行
- 一行被视为由换行符(’\ n’),回车符(’\ r’)中的任何一个或随后的换行符终止。
- 如果到达流的末尾,则返回null而不是-1
5. 效率比较
作为普通输入输出流的增强,其效率极高。下面将用一个例子进行测试。
使用FileInputStream和FileOutputStream进行文件的复制移动,文件大小为1.90MB
public class Test {
public static void main(String[] args){
try(FileInputStream fis = new FileInputStream("D://猫猫.jpg");
FileOutputStream fos = new FileOutputStream("E://猫猫.jpg")) {
byte[] bytes = new byte[1024];
int len = 0;
long start = System.currentTimeMillis();
while((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
long end = System.currentTimeMillis();
System.out.println("运行时间为:" + (end - start) + "ms");
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行时间为:25ms
使用缓冲流进行文件的复制移动
public class Test {
public static void main(String[] args){
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D://猫猫.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E://猫猫.jpg"))){
byte[] bytes = new byte[1024];
int len = 0;
long start = System.currentTimeMillis();
while((len = bis.read(bytes)) != -1){
bos.write(bytes,0,len);
}
long end = System.currentTimeMillis();
System.out.println("运行时间为:" + (end - start) + "ms");
}catch (IOException e){
e.printStackTrace();
}
}
}
运行时间为:9ms
结果比较:
普通IO流 | 缓冲流 |
---|---|
25ms | 9ms |
由此可见,缓冲流的效率大大高于普通IO流,但是代价是缓冲数组会占用额外的空间。