InputStream是Java标准库提供的最基本的输入流,位于java.io包里,InputStream是一个抽象类,是所有输入流的超类
FileInputStream是InputStream的子类,就是从文件流中读取数据。FileInputStream是读取一个文件来作InputStream。
BufferedInputStream是缓存输入流。继承于FilterInputStream。作用是为另一个输入流添加一些功能。BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),作用是为另一个输入流添加一些功能。它自己不能脱离里面那个单独存在,所以可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。
区别就是:
FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高,FileInputStream的read()方法会出现阻塞;
就是说,当缓冲区的大小比8192小的时候,BufferedInputStream的效率更好。
BufferedInputStream有一个默认为8192字节的缓冲区,当自定义的缓冲区小于8192的时候,默认一次性从硬盘中读取8192字节到内存中,然后每次只按自定义的缓冲量返回数据,性能好在了减少了读取硬盘的次数。
以下代码会更好的帮大家理解。
代码实现:
FileInputStream read()方法实现:
public class Demo05 {
public static void main(String[] args) throws IOException {
//InputStream字节输入流父类
//特点:读取字节内容的输入流
FileInputStream fis = new FileInputStream("E:\\KuGou\\test02.txt");
//逐个字节读取:每次调用read()方法,都会进行一次磁盘的读取,返回一个int类型的字节值
int data = -1;
while((data=fis.read())!=-1) {
System.out.println(data);
}
System.out.println("-----------");
//方式二
//批量读取(自建缓冲区):每次调用read(缓冲区字节数组)方法,都会进行一次磁盘的读取,返回本次
//并将读取到的内容,填充至自建缓冲区
//读取至文件末尾,返回-1
byte[] buff = new byte[4096];//字节数组代表一个缓冲区
int len = -1;
while((len=fis.read(buff))!= -1) {
System.out.println(Arrays.toString(buff));
}
}
}
BufferedInputStream read()方法代码实现
public class Demo05 {
public static void main(String[] args) throws IOException {
//InputStream字节输入流父类
//BufferedInputStream时FilterInputStream包装(装饰)器的子类
//特点:自带缓存区(默认8192个字节),必须配合FileInputStream类进行工作
BufferedInputStream bos = new BufferedInputStream(new FileInputStream("E:\\壁纸总和\\壁纸\\杨洋\\young.jpg"));
//读取
//方式一:逐个字节读取,每调用一次read()方法,都会到BufferedInputStream的缓存区中读取一个字节
//缓冲区内容读取完毕后,会一次性fill满
//bos.read();
//方式二:(推荐)
//批量读取(自建缓存区):
byte[] buffData =new byte[128];
int size = -1;
while((size = bos.read(buffData))!=-1) {
System.out.println(Arrays.toString(buffData));
}
}
}