Java 中 BufferedInputStream 到底有什么用?怎么感觉它很多余呢?
BufferedInputStream是把流暂时读取到一个缓冲冲数据组里面,而后直接操作数据里面的数据,这样可以比直接操作文件快了很多,但我有一个疑问.为什么不直接用Fi...
BufferedInputStream 是把流暂时读取到一个缓冲冲数据组里面,而后直接操作数据里面的数据,这样可以比直接操作文件快了很多,但我有一个疑问.为什么不直接用FileInputStream 里面的read(buffer)方法,直接读取到自己的buffer 里面,然后写的时候直接把自己的buffer 写的文件里面,而不用BufferedInputStream 读取到内部定义的缓冲区,然后自己还得从它的缓冲里面进行数组拷贝,这样不是慢了很多了么,为什么不直接把自己buffer 写进去,感觉还是这样快,还是不理解BufferedInputStream 的作用?求指教.....
展开
展开全部
FileInputStream 里面的read(buffer)方法,直接读取到自己的buffer 里面
这个是读取到一个数组里面,jvm里面创建一个新对象都需要耗费时间的,而且每一次read都要执行I/O操作,比较慢。
BufferedInputStream在你创建对象的时候就已经建立好缓冲区数组拉,一定程度上可以减少java生成新对象消费的时间。另外用buffered好处,可以参考API...
作为另一种输入流,BufferedInputStream 为添加了功能,即缓冲输入和支持 mark 和 reset 方法的能力。创建 BufferedInputStream 时即创建了一个内部缓冲区数组。读取或跳过流中的各字节时,必要时可根据所包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作导致在从所包含的输入流中获取新的字节前,再次读取自最后一次 mark 操作以来所读取的所有字节。
这个是读取到一个数组里面,jvm里面创建一个新对象都需要耗费时间的,而且每一次read都要执行I/O操作,比较慢。
BufferedInputStream在你创建对象的时候就已经建立好缓冲区数组拉,一定程度上可以减少java生成新对象消费的时间。另外用buffered好处,可以参考API...
作为另一种输入流,BufferedInputStream 为添加了功能,即缓冲输入和支持 mark 和 reset 方法的能力。创建 BufferedInputStream 时即创建了一个内部缓冲区数组。读取或跳过流中的各字节时,必要时可根据所包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作导致在从所包含的输入流中获取新的字节前,再次读取自最后一次 mark 操作以来所读取的所有字节。
展开全部
其实看使用场景,一次性读取将整个文件都加入的内存中很慢,多次读取但是每次读取字节太小也会很慢,这个速度需要一个调试权衡的过程,一般情况下8092是个比较适中的读取数组大小。其实BufferedInputStream的确有缓冲的实现,但是文件流的读取速度和缓冲关系不大,关系最大的是8092,如果将8092改成16的话就慢多了。你如果用FileInputStream读取文件每次读取数组大小也是8092,那么也不会比BufferedInputStream慢。当然缓冲流BufferedInputStream的使用场景肯定有的,而且很多,比如视频播放,音乐播放这些多媒体的场景就非常适合用缓冲流,而文件下载上传复制拷贝这些场景直接使用FileInputStream就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在bufferedinputstream的read函数实现当中,读多个字符是使用System.arraycopy( src, srcPos, dest, destPos, length )这个函数,意思是直接将一片内存进行拷贝过去,而不是像其他的read函数一样一次只拷贝一个字节或字符。这样就快了很多。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-11-01
展开全部
为什么不直接把自己buffer 写进去,感觉还是这样快!
有想法就是最好的,但是不要光感觉,你是不是可以做一些测试呢?just do it!
有想法就是最好的,但是不要光感觉,你是不是可以做一些测试呢?just do it!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询