缓冲流是在其它流的基础上增加一个缓冲区,当处理大量数据时,缓冲流通过在内存中创建缓冲区来减少与磁盘或网络的实际交互次数,以此来提高数据的读写效率。缓冲流包括缓冲输入流(BufferedInputStream)和缓冲输出流(BufferedOutputStream),其中,BufferedInputStream是FilterInputStream的子类,BufferedOutputStream是FilterOutputStream的子类。FilterInputStream和FilterOutputStream是过滤器流的根类,这两个类都是抽象类。(Java中流的概念)
缓冲输入流BufferedInputStream类的构造方法如下:
构造方法 | 含义 |
BufferedInputStream(InputStream in) | 创建一个默认大小的缓冲输入流对象。 |
BufferedInputStream(InputStream in, int size) | 创建一个指定大小的缓冲输入流对象。 |
其中,参数in表示缓冲输入流所包装的输入流对象,参数size为缓冲区的大小,默认值为8192个字节。
例如,下面的代码创建一个包装文件输入流对象的缓冲输入流对象。
FileInputStream fis=new FileInputStream("D:\\examples\\myfile1.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
缓冲输出流BufferedOutputStream类的构造方法如下:
构造方法 | 含义 |
BufferedOutputStream(OutputStream out) | 创建一个默认大小的缓冲输出流对象。 |
BufferedOutputStream(OutputStream out, int size) | 创建一个指定大小的缓冲输出流对象。 |
其中,参数out表示缓冲输入流所包装的输出流对象,参数size为缓冲区的大小,默认为8192个字节。
例如,下面的代码创建一个包装文件输出流对象的缓冲输出流对象。
FileOutputStream fos=new FileOutputStream("D:\\examples\\myfile1.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
当读写数据时,数据以块为单位先进入缓冲区(块的大小可以进行设置),其后的读写操作则作用于缓冲区。只有缓冲区满时才会将数据送到输出流。一般在关闭一个缓冲区输出流之前,应使用flush()方法,强制输出剩余数据,以确保缓冲区内的所有数据全部写入输出流。缓冲区输出流提供了对mark()、reset()、skip()等方法的支持。
【例1】利用文件字节流和缓冲流实现文件复制
public static void copy(String sourceFile,String targetFile,int size) {
try {
FileInputStream fis=new FileInputStream(sourceFile);
BufferedInputStream bis=new BufferedInputStream(fis,size);
FileOutputStream fos=new FileOutputStream(targetFile);
BufferedOutputStream bos=new BufferedOutputStream(fos,size);
int b;
while((b=bis.read())!=-1) {
bos.write(b);
}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}