缓冲流就是带有一个缓冲区的流。
原有的流是直接读入读出,读出的时候直接与存储系统交互(如磁盘等),涉及到I\O操作就比较慢。
可类别送快递:一开始是一件一件送,后来用车送到一个集中点,然后再送到用户手上,极大节省了中间的传输时间。
缓冲字节流:
BufferedInputStream
public class FilterInputStream extends InputStream {
...
}
public class BufferedInputStream extends FilterInputStream {
//默认缓冲区大小
private static int DEFAULT_BUFFER_SIZE = 8192;
//使用字节数组作为缓冲区
protected volatile byte buf[];
//构造方法1 从构造方法可看出,缓冲流依赖其他流写入到缓冲区
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
//构造方法2 支持自定义缓冲区大小
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
//继承自字节输入流的超类 InputStream,因此具有一切读的方法、关闭资源....等
}
BufferedOutputStream:
class FilterOutputStream extends OutputStream{
....
}
public class BufferedOutputStream extends FilterOutputStream {
//缓冲数组
protected byte buf[];
//构造方法1
public BufferedOutputStream(OutputStream out) {
this(out, 8192); //默认大小
}
//构造方法2 自定义缓冲区大小
public BufferedOutputStream(OutputStream out, int size) {
super(out);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
}
//超级父类OutputStream
....写出的方法
字符缓冲流与其功能类似,使用字符进行数据缓存。
BufferedReader、BufferedWriter
简单单例,使用缓冲流复制文件:
//复制源
private static final String FILE_NAME = "XXXX";
//输出位置
private static final String OUT_FILE_NAME = "XXXOOOO";
try {
InputStream fIn = new FileInputStream(FILE_NAME);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fIn, 3 * 1024);
//缓冲字节输出流
FileOutputStream fileOutputStream = new FileOutputStream(OUT_FILE_NAME);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
long sTime = System.currentTimeMillis();
byte[] rbs = new byte[1024 * 10];
int count;
while ((count = bufferedInputStream.read(rbs)) != -1) {
bufferedOutputStream.write(rbs, 0, count);
}
long endTine = System.currentTimeMillis();
System.out.println("用时: " + (endTine - sTime));
bufferedOutputStream.flush();
bufferedInputStream.close();
bufferedOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}