inputStream的在BufferedInputStream中使用到的方法
1、read()
2、skip()
3、available()
浅复制
BufferedInputStream内部维护一个缓冲字节数组,
当调用read1(byte[] b)方法时,核心原理是将内部缓冲字节数组的内容,浅复制到方法参数的目标字节数组中。
这样做的好处是,避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),可想而知,如果数据量巨大,这样的磁盘消耗非常可怕。而通过缓冲区的实现,读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘IO,载入一段数据填充缓冲,那么下一次读取一般情况下就直接可以从缓冲区读取,减少了磁盘IO
2、如果内部缓冲字节数组的剩余字节数,小于用户的目标读取字节数,按照剩余字节数的大小浅复制给目标字节数组;
1、read()
2、skip()
3、available()
浅复制
BufferedInputStream内部维护一个缓冲字节数组,
当调用read1(byte[] b)方法时,核心原理是将内部缓冲字节数组的内容,浅复制到方法参数的目标字节数组中。
这样做的好处是,避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),可想而知,如果数据量巨大,这样的磁盘消耗非常可怕。而通过缓冲区的实现,读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘IO,载入一段数据填充缓冲,那么下一次读取一般情况下就直接可以从缓冲区读取,减少了磁盘IO
read1(byte[] b, int off, int len)
方法是非贪婪读取,最多只从底层字节流读取一次
处理方式简称为:缓冲区没剩先填充,有剩直接读,读取有偏差,不一定按目标。
处理方式如下:
如果内部缓冲字节数组的剩余字节数为0:
额外判断:如果目标读取字节数大于内部缓冲字节数组的长度 ,直接从底层字节流读取目标读取字节数,给目标字节数组。这样做的好处是,不用经过填充内部缓冲字节数组的中间过程,实现流的平滑降级;
调用fill()方法填充内部缓冲字节数组。并再次检查填充后缓冲区的剩余字节数是否大于0,从而判断是否达到文件尾。
如果内部缓冲字节数组的剩余字节数大于0:
2、如果内部缓冲字节数组的剩余字节数,小于用户的目标读取字节数,按照剩余字节数的大小浅复制给目标字节数组;
/**
* Read characters into a portion of an array, reading from the underlying
* stream at most once if necessary.
*/
private int read1(byte[] b, int off, int len) throws IOException {
int avail = count - pos;
if (avail <= 0) {
/* If the requested length is at least as large as the buffer, and
if there is no mark/reset activity, do not bother to copy the
bytes into the local buffer. In this way buffered strea