为了账号安全,请及时绑定邮箱和手机立即绑定

关于FileOutputStream,DataOutputStream,BufferedOutputStream的理解对错

老师说:

FileOutputStream--->write方法,相当于一滴一滴把水“转移”过去
DataOutputStream--->writexxx(如writeInt)方法,会方便一些,相当于一瓢一瓢“转移”水
BufferedOutputStream--->writexxx()方法,更方便,相当于一瓢一瓢水先放入桶(缓冲区)中,然后直接把桶里水倒入缸中

我听着反而有点怪,因为同样是一瓢一瓢,这缓冲区不是反而还多个桶倒入缸的过程,不是更慢么?

我就自己理解成这两个缸中间加一段距离,也就是说本来都是一滴一滴,或者一瓢一瓢,拿起水走到另一个缸旁边把水倒进去,而缓冲区就是多了个桶,可以在这边的缸旁边一瓢一瓢把桶装满,然后提着桶过去倒水,也就是路上走的路程少了,节约的时间是从这里体现出来的?

正在回答

3 回答

首先暂且不看你说的问题,我们先来说明一个关于用时的问题:

在文件的拷贝过程中,最耗时的就是IO操作,也就是取 或者存进文件的过程最耗时,(也就是从水缸中取或者放水的过程,反而运送的过程不算耗时。)

所以对于你的问题,我相信你关于一滴一滴 和一瓢一瓢你是没有问题的,因为一瓢一瓢显然取的次数比一滴一滴的少。你所不能理解的就是缓冲区同样是一瓢一瓢的,而且还增加了倒入桶的过程,但是为什么还要比DataOutputStream--->writexxx(如writeInt)方法快一些,其实准确来说,应该是一次取一个缓冲区那么大小的文件,也就是一桶一桶的取(不用瓢,直接上桶从缸中取水),装满缓冲区(桶)然后才运送一次。如果说你非要理解为一瓢一瓢的取也可以说得过去,那么就是我们倒入缸中的时候,是一桶一桶倒进去的。那么自然就IO次数少了。


关于用时7毫秒的批量处理,可以理解为直接把水从一个缸倒入另一个缸,因为是把所有文件写进内存然后再一次性写入文件的。


希望我的回答可以帮助你。

1 回复 有任何疑惑可以回复我~
#1

特地学java 提问者

非常感谢!
2016-03-03 回复 有任何疑惑可以回复我~
#2

怒放的生命012

这里的buffer可不可以理解成Stringbuffer中的buffer???
2016-07-01 回复 有任何疑惑可以回复我~

这个问题首先要明白,读取和写入的过程;

知道运行内存吧???计算机为什么要运行内存呢???其实运行内存就是一个缓冲区!!

文件的读取和写入操作的过程是这样的:

(1)首先说一下批量读取和单个字节的读取

批量读取是new一个对象,new一个对象就是在内存中申请一个和new的要求的大小相一致的运行内存;

单个读取系统默认申请了一个字节的运行内存;

(2)文件的读取和写入

 1.先说单个字节的读取,从原文件中读取一个字节放入到内存中,再从内存中把一个字节大小的数据放入到目标文件中;(强调一次操作必须是直接从源文件到内存再到目标文件, 才能再次读取下个字节)

2.再说批量读取,同理

从原文件中读取多个字节放入到内存中,再从内存中把多个字节大小的数据放入到目标文件中;(强调一次操作必须是直接从源文件到内存再到目标文件, 才能再次读取下多字节)

(3)从2中我们就能理解Buffer的运行机制了,开始解释(再强调一下运存既是缓存区)

buffer的单个读取,同理读取既是先读取一个字节放入内存中,在读取一个字节中,直到读取完整个文件,批量从缓存中放到目标文件中,可以看粗这样节省了一次一次的从内存中到目标文件的过程即(1——》2——》3变成了1——》3,这样从需要花费2步,变成只花费了一步,所以buffer的性能应该是正常的一倍)

buffer的批量读取,同理读取既是先读取多个字节放入内存中,在读取多个字节中,直到读取完整个文件,批量从缓存中放到目标文件中,可以看粗这样节省了一次一次的从内存中到目标文件的过程即(1——》2——》3变成了1——》3,这样从需要花费2步,变成只花费了一步,所以buffer的性能应该是正常的一倍)

(4)总结,累死我了,以上内容纯属自己瞎想,没有验证,求大神验证,告诉我答案,

    我是渣渣,我是新手,验证发现我说的错了,请不要骂我,xiexie


0 回复 有任何疑惑可以回复我~
#1

染红_街道

但是fileoutputstream 不是有 read(byte【】 b) 方法吗?他不是一次性读取很多, 怎么还会慢?? 还有一次全读完再写会怎样? randomAccessFile 的读写与这几个比较有啥区别
2016-07-03 回复 有任何疑惑可以回复我~

也就是说其实加上缓冲区,它用的已经不是和DataOutputStream一样的瓢了,它相当于用一个型号更大的东西舀水再倒。

或者假定都是瓢,系统耗时主要在于两个地方:1.从缸里取水,不管是一滴还是一瓢,2.往缸里倒水,同样不管一滴还是一瓢。DataOutputStream与BufferedOutputStream在取水过程中,耗时一样,都是一瓢一瓢取水,但是在倒水过程中,前者还是一瓢一瓢倒水,后者则换成了一桶一桶倒水,也就是节约的时间在于倒水的过程

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于FileOutputStream,DataOutputStream,BufferedOutputStream的理解对错

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信