缓冲字节输入流对比字节输入流在文件的读取上有着很明显的优势
从原来上来说就是,字节输入流,每次调用read方法都是从用户态切换到内核态,进行系统调用,读取一个字节的内容,再从内核态切换到用户态。而缓冲字节输入流是在用户态切换到内核态的时候,内核态本身其实也是维护着一个4K的缓冲区,此时的系统的调用把4K的内容复制到用户态的8K的缓冲区当中,发现还没有填满这个缓冲区,于是又复制了4K的内容到缓冲区,于是,每次调用read方法的时候,不是从内核态的硬盘当中去读取数据,而是从用户态的8K的缓冲区中去读取数据了,从而提升了效率
代码部分
package io.byteStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
/**
* @Author: micro cloud fly
* @Description: BufferInputStream 缓冲字节输入流
* 关于bufferedStream的一些原理,可以参考博客https://blog.csdn.net/m0_37133375/article/details/95685751
* 从内核中一次读取8K的数据到缓冲区,即字节数组中,然后每次调用read方法,只是从字节数组这个
* 缓冲区当中去读取,只有缓冲区中没有数据的时候才去内核中再去读取,避免频繁的io开销
* @Date: Created in 11:26 下午 2020/10/18
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
FileInputStream inputStream = new FileInputStream("/Users/java0904/Pictures/imgs/2.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
//fileinputStream每次都是从硬盘读取一个字节的数据,磁盘开销大
//而bufferdInputStream内部维护了一个缓冲区,每次从硬盘读取的是DEFAULT_BUFFER_SIZE = 8192个字节
//即8K的数据到缓冲区
int len = 0;
while ((len = bufferedInputStream.read()) != -1) {
System.out.println((char) len);
}
bufferedInputStream.close();
}
}