Java输入输出流——字节缓冲流BufferedInputStream、BufferedOutputStream
缓冲流概述
缓冲流作用
缓冲输入流BufferedInputStream
缓冲输出流BufferedOutputStream
作用:提高读写速度。
查看api(查看缓冲流属性和构造方法)
属性:
构造方法:
方法
注:flush()方法的原理解释:缓冲区的大小很大,有几千个字节。这里举例设定缓冲区大小为20个字节,如果存放到缓冲区的数据刚好是20个字节,那么缓冲区的数据会自动执行写操作(write),例如将数据写入对应的FileOutputStream文件输出流中,并通过文件输出流写入文件;如果存入到缓冲区的数据只有10个字节,并没有存满,这时则不会触发write方法去执行写操作,就会导致我们没有将数据写入文件当中,就会出问题。因此,在缓冲区不满的时候,我们调用flush()方法进行缓冲区的强制清空。
案例:缓冲流的使用
操作的文件依然为D:\学习\eclipse_studyspace\IOProj
中的study.txt,其中内容为空。
(1) 建立缓冲流
package com.study.myfile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedDemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("study.txt");
FileOutputStream fos = new FileOutputStream("study.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(50);
bos.write('a');
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
运行发现,study.txt中依然是空的,没有内容。这里就验证了缓冲流是将数据写入缓冲区中了,并没有再将缓冲区中的数据写入study.txt中,这说明缓冲区未满,没有自动触发write方法执行写操作。
(2) 调用flush()方法强制清空
try {
FileInputStream fis = new FileInputStream("study.txt");
FileOutputStream fos = new FileOutputStream("study.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(50);
bos.write('a');
bos.flush();
}
运行发现,study.txt中的内容为:
2a
(3) 不调用flush()方法,而调用close()方法
try {
FileInputStream fis = new FileInputStream("study.txt");
FileOutputStream fos = new FileOutputStream("study.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(50);
bos.write('a');
// bos.flush();
bos.close();
}
运行发现,study.txt中的内容依然为:
2a
发现数据依然写进来了,这说明:如果flush与close方法都不调用而缓冲区未满,是不会执行写操作(write)的。当调用flush与close中的任何一个方法后,都会强制清空缓冲区中剩余的内容。
(4) 建立缓冲输入流
package com.study.myfile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedDemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("study.txt");
FileOutputStream fos = new FileOutputStream("study.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(50);
bos.write('a');
bos.flush();
System.out.println(bis.read());
System.out.println((char)bis.read());
fos.close();
bos.close();
fis.close();
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
50
a
运行发现,study.txt中的内容为:
2a
获取系统的当前时间,查看flush方法的提高读写速度的作用
获取系统的当前时间:
long startTime = System.currentTimeMillis();
返回值为长整型数据。计算方式是当前时间减1970年1月1日(程序就是这么设定的)。
查看flush方法的提高读写速度的作用:
try {
FileInputStream fis = new FileInputStream("study.txt");
FileOutputStream fos = new FileOutputStream("study.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
long startTime = System.currentTimeMillis();
bos.write(50);
bos.write('a');
bos.flush();
System.out.println(bis.read());
System.out.println((char)bis.read());
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
fos.close();
bos.close();
fis.close();
bis.close();
}
这里由于文件较小看不出效果,需要大文件来进行测试。