java中BufferedInputStream相较于FileInputStream的优势是那些?

J2EE 码拜 9年前 (2015-04-04) 1562次浏览 0个评论

BufferedInputStream 是把流暂时读取到一个缓冲数据组里面,而后直接操作数组里面的数据,这样比直接操作文件快了很多,但我有一个疑问.为什么不直接用FileInputStream 里面的read(buffer)方法,直接读取到自己的buffer 里面,然后写的时候直接把自己的buffer 写的文件里面,而不用BufferedInputStream 读取到内部定义的缓冲区,然后自己还得从它的缓冲里面进行数组拷贝,这样不是慢了很多了么,为什么不直接把自己buffer 写进去,感觉还是这样快,还是不理解BufferedInputStream 的作用?求指教.....

java中BufferedInputStream相较于FileInputStream的优势是那些?
刚查的
BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。   
FileInputStream与BufferedInputStream区别:
FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;
java中BufferedInputStream相较于FileInputStream的优势是那些?
BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。
java中BufferedInputStream相较于FileInputStream的优势是那些?
楼下10个苹果,要送到10层,一个一个送,还是10个一起送好
java中BufferedInputStream相较于FileInputStream的优势是那些?
引用 2 楼 t_jl1979 的回复:

BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。

也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?

java中BufferedInputStream相较于FileInputStream的优势是那些?
引用 4 楼 rhjetjdfgjr 的回复:
Quote: 引用 2 楼 t_jl1979 的回复:

BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。

也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?

我只例举了一个,其他方法都是类似。

java中BufferedInputStream相较于FileInputStream的优势是那些?
引用 5 楼 t_jl1979 的回复:
Quote: 引用 4 楼 rhjetjdfgjr 的回复:
Quote: 引用 2 楼 t_jl1979 的回复:

BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。

也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?

我只例举了一个,其他方法都是类似。

我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊

java中BufferedInputStream相较于FileInputStream的优势是那些?
40分
引用 6 楼 rhjetjdfgjr 的回复:
Quote: 引用 5 楼 t_jl1979 的回复:
Quote: 引用 4 楼 rhjetjdfgjr 的回复:
Quote: 引用 2 楼 t_jl1979 的回复:

BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。

也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?

我只例举了一个,其他方法都是类似。

我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊

看一下这个篇文章。
http://www.software8.co/wzjs/java/1770.html

java中BufferedInputStream相较于FileInputStream的优势是那些?
引用 7 楼 t_jl1979 的回复:
Quote: 引用 6 楼 rhjetjdfgjr 的回复:
Quote: 引用 5 楼 t_jl1979 的回复:
Quote: 引用 4 楼 rhjetjdfgjr 的回复:
Quote: 引用 2 楼 t_jl1979 的回复:

BufferedInputStream里面的read读取操作:
           if (len >= getBufIfOpen().length && markpos < 0) {
                return getInIfOpen().read(b, off, len);
            }
从上面的代码看,在BufferedInputStream调用read的时候,如果长度大于缓冲去长度,也是直接调用FileInputStream 里面的read方法。这样两个类性能没差异。
不同的的是,在BufferedInputStream如果在缓存区足够大的情况下会调用fill()方法,进行预读。此时有可能之前buffer中已经存在部分上次调用read时fill()方法进行预读的数据,正是本次所需要的,此时性能较高。

也就是说这两个类的性能差别是体现在read()方法上,如果调用read(buffer),或read(buffer,start,len)方法的话,其实并没有差别。可不可以这样理解?

我只例举了一个,其他方法都是类似。

我也看了一下BufferedInputStream的源码,它默认为使用者创建了一个缓冲区,可以自定义大小,也可以使用默认大小,同时重写了FileInputStream的read方法,然后定义了一个私有的read1方法,在这个私有方法中调用了fill()方法。这个fill方法我没看明白,它的作用是什么?如你所说是对数据进行预读,那么它是怎么实现的?还望不吝赐教,感激不尽啊

看一下这个篇文章。
http://www.software8.co/wzjs/java/1770.html

真是太谢谢你了 上面的链接中的内容讲的很详细。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java中BufferedInputStream相较于FileInputStream的优势是那些?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!