在谈“FileInputStream”与“BufferedInputStream”的区别之前,我们先要明白“FileInputStream”与“BufferedInputStream”分别是什么;
FileInputStream,它是InputStream的实现类,又被称为“字节输入流”,FileInputStream是到磁盘中读取文件,在读取文件时可以以一个字节一个字节读,也可以一批字节一批字节地读,具体实现代码如下:
到磁盘中逐个读取:
public static void main(String[] args) {
try (InputStream in = new FileInputStream("D:\\文件操作\\222.txt")) {
int data=-1;//保存每次读取到的字节值
//逐个读取
while((data=in.read())!=-1) {
System.out.println((char)data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
就好比到苹果园摘苹果,这种方式是摘一颗,往出拿一颗;
到磁盘中批量读取:
public static void main(String[] args) {
try (InputStream in = new FileInputStream("D:\\文件操作\\333.jpg")) {
byte[] buff=new byte[128];
int len=-1;
//批量读取(缓冲)
while((len=in.read(buff))!=-1) {
System.out.printf("本次读取%d字节,字节数组为:%s\n",len,Arrays.toString(buff));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
而这种方式是摘满一筐苹果在往出拿;
BufferedInputStream,他是FilterInputStream的实现类,也是FileInputStream的装饰器,在创建BufferedInputStream的对象时必须传入FileInputStream对象参数,BufferedInputStream被称为“带有缓冲区的字节输入流”,在内存中维护着一块特殊的空间(缓冲区),该缓冲区默认大小为:8192字节,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。具体实现代码如下:
public static void main(String[] args) {
//带有缓冲区的字节输入流
//缓冲区默认大小8192
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\文件操作\\333.jpg"))) {
int data=-1;
//从内存的buff缓冲区读取字节
while((data=bis.read())!=-1) {
System.out.println(data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这种方式就好比,我们站在苹果园外边不用动,有人将苹果摘好,放到你旁边,当你拿完你旁边的苹果,会有人继续放,直到拿完苹果园苹果为止;
总而言之,BufferedInputStream读取文件的速度远大于FileInputStream读取文件的速度,且BufferedInputStream是到内存中的缓存区进行读取,而FileInputStream是到磁盘中进行读取;