InputStream
Java标准库提供的最基本的输入流,位于java.io包里,InputStream是一个抽象类,是所有输入流的超类
FileInputStream
1.FileInputStream是InputStream的子类,就是从文件流中读取数据。FileInputStream是读取一个文件来作InputStream。
BufferedInputStream
2.BufferedInputStream是缓存输入流。继承于FilterInputStream。作用是为另一个输入流添加一些功能。它的read方法表面上看,虽然是只读了一个字节,但它是开始时猛然从硬盘读入一大堆字节到自己的缓 存,当你read时,它是从缓存读进一个字节到内存。而前面讲的FileInputStream字节流,read时,都是真正每个字节都从硬盘到内存,是 很慢的
区别就是:
FileInputStream是字节流
BufferedInputStream是字节缓冲流
使用BufferedInputStream读资源比FileInputStream读取资源的效率高,而FileInputStream的read()方法会出现阻塞;
就是说,BufferedInputStream的效率更好。
(小知识)BufferedInputStream有一个默认为8192字节的缓冲区,当自定义的缓冲区小于8192的时候,默认一次性从硬盘中读取8192字节到内存中,然后每次只按自定义的缓冲量返回数据,性能好在了减少了读取硬盘的次数。
以下代码会更好的帮大家理解;
package Ex1;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @Classname BufferedInputStream1
* @Description TODO
* @Date 2022/9/23 10:35
* @Created by Administrator
* @Author:ZhenYi
*/
public class BufferedInputStream1 {
public static void main(String[] args) {
String file = "C:\\image\\1.jpg";
try (FileInputStream fis = new FileInputStream(file);
//构造方法
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
//FileInputStream
long t = System.currentTimeMillis();
int c;
while ((c = fis.read()) != -1) {
}
fis.close();
t = System.currentTimeMillis() - t;
System.out.println("FileInputStream 遍历文件用了如下时间:" + t);
//使用缓冲流、提速
//BufferedInputStream
t = System.currentTimeMillis();
while ((c = bis.read()) != -1) {
}
bis.close();
t = System.currentTimeMillis() - t;
System.out.println("BufferedInputStream 遍历文件用了如下时间:" + t);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
对比如下读取时间,可以看出BufferedInputStream的效率更好。