缓冲流
- 一、缓冲流概述
- 二、缓冲流的使用
- 2.1 缓冲流(字节型)实现非文本文件的复制
- 2.1.1 缓冲流(字节型)实现非文本文件的复制与节点流实现的区别
- 2.2 缓冲流(字符型)实现文本文件的复制
- 2.2.1
- 2.2.2 缓冲流(字符型)实现文本文件的复制与节点流实现的区别
- 2.3 缓冲流与节点流读写速度的对比
- 2.3.1 缓冲流速度提升的原因
一、缓冲流概述
- 缓冲流是处理流的一种,是对节点流的一次包装
- 处理流就是包装在其他流的基础上
- 缓冲流的主要作用是为了提高文件的读写效率
四种缓冲流:
字符流:
BufferedReader
:BufferedWriter
:字节流:
BufferedInputStream
:BufferedOutputStream
:
二、缓冲流的使用
2.1 缓冲流(字节型)实现非文本文件的复制
@Test
public void BufferedStreamTest(){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//1、指定要复制的文件路径,复制的目标路径
File inf = new File("皮卡丘.jpg");
File otf = new File("皮卡丘副本2.jpg");
//2、造流
//2.1 造节点流
fis = new FileInputStream(inf);
fos = new FileOutputStream(otf);
//2.2造缓冲流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//3、复制操作
int len;
byte buffer[] = new byte[1024];
while ((len = bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4、关闭流
//要求:先关闭外层流,再关闭内层流
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//说明:在关闭外层流时,内层流也会自动的关闭,所以关于内层流的关闭可以省略
}
}
2.1.1 缓冲流(字节型)实现非文本文件的复制与节点流实现的区别
节点流实现 | 缓冲流实现 | |
第一步:指定文件 | File inf = new File(“皮卡丘.jpg”); File otf = new File(“皮卡丘副本2.jpg”); | 相同 |
第二步:造流 | 造字节流fis = new FileInputStream(inf); fos = new FileOutputStream(otf); | 缓冲流相当于对字节流的一次包装,所以造完字节流之后才能造缓冲流:bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); |
第三步:复制操作 | read(byte[] buffer); write(byte[],0,len) | read(byte[] buffer); write(byte[],0,len) |
第四步:关闭流 | fis.close();fos.close(); | bis.close();bos.close(); 原则上要先关闭外层的缓冲流,再关闭内层的字节流,但是因为在关闭外层流的时候,内层流自动关闭,所以程序中可以不写内层流的关闭代码 |
2.2 缓冲流(字符型)实现文本文件的复制
2.2.1
@Test
public void copyForBufferReaderWriter(){
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
//1、指明文件、造流
//1.1 造字符流
Reader reader = new FileReader(new File("hello.txt"));
Writer writer = new FileWriter(new File("hello1.txt"),false);//为true是不覆盖,默认为false
//1.2 造缓冲流
bufferedReader = new BufferedReader(reader);
bufferedWriter = new BufferedWriter(writer);
//2、复制操作
//方式一:使用char[]数组
/* int len;
char[] arr = new char[1024];
while ((len = bufferedReader.read(arr)) != -1){
bufferedWriter.write(arr,0,len);//写出时注意要用三个元素的write
// bufferedWriter.flush();
}*/
//方式二:使用String,一行一行地读数据
String data;
while ((data = bufferedReader.readLine()) != null){
bufferedWriter.write(data);//data中不包含换行符
bufferedWriter.newLine();//换行
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//3、关闭外层流(内层自动关闭)
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2.2 缓冲流(字符型)实现文本文件的复制与节点流实现的区别
节点流实现 | 缓冲流实现 | |
第一步:指定文件 | File inf = new File(“皮卡丘.jpg”); File otf = new File(“皮卡丘副本2.jpg”); | 相同 |
第二步:造流 | 造字节流fis = new FileInputStream(inf); fos = new FileOutputStream(otf); | 缓冲流相当于对字节流的一次包装,所以造完字节流之后才能造缓冲流:bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); |
第三步:复制操作 | read(char[] cbuf); write(char[] cbuf,0,len) | 方式一:read(char[] cbuf); write(char[] cbuf,0,len)方式二:String readLine() |
第四步:关闭流 | fis.close();fos.close(); | bis.close();bos.close(); 原则上要先关闭外层的缓冲流,再关闭内层的字节流,但是因为在关闭外层流的时候,内层流自动关闭,所以程序中可以不写内层流的关闭代码 |
2.3 缓冲流与节点流读写速度的对比
同一代码,节点流的执行速度
同一代码,缓冲流的执行速度
由上图可见,使用缓冲流后,文件的读写速度得到了明显提升。
2.3.1 缓冲流速度提升的原因
缓冲流内部提供了一个缓冲区
字节缓冲输入流自带8KB缓冲池,直接从缓冲池中读取数据
字节缓冲输出流自带8KB缓冲池,数据直接写入缓冲池
对处理流来讲输出都会有flush
:每次调用时内存中的数据都会写出,部分流没有内部调用,需要手写
补充:flush
:刷新缓冲区