特地学java
2016-03-01 15:36
老师说:
FileOutputStream--->write方法,相当于一滴一滴把水“转移”过去
DataOutputStream--->writexxx(如writeInt)方法,会方便一些,相当于一瓢一瓢“转移”水
BufferedOutputStream--->writexxx()方法,更方便,相当于一瓢一瓢水先放入桶(缓冲区)中,然后直接把桶里水倒入缸中
我听着反而有点怪,因为同样是一瓢一瓢,这缓冲区不是反而还多个桶倒入缸的过程,不是更慢么?
我就自己理解成这两个缸中间加一段距离,也就是说本来都是一滴一滴,或者一瓢一瓢,拿起水走到另一个缸旁边把水倒进去,而缓冲区就是多了个桶,可以在这边的缸旁边一瓢一瓢把桶装满,然后提着桶过去倒水,也就是路上走的路程少了,节约的时间是从这里体现出来的?
首先暂且不看你说的问题,我们先来说明一个关于用时的问题:
在文件的拷贝过程中,最耗时的就是IO操作,也就是取 或者存进文件的过程最耗时,(也就是从水缸中取或者放水的过程,反而运送的过程不算耗时。)
所以对于你的问题,我相信你关于一滴一滴 和一瓢一瓢你是没有问题的,因为一瓢一瓢显然取的次数比一滴一滴的少。你所不能理解的就是缓冲区同样是一瓢一瓢的,而且还增加了倒入桶的过程,但是为什么还要比DataOutputStream--->writexxx(如writeInt)方法快一些,其实准确来说,应该是一次取一个缓冲区那么大小的文件,也就是一桶一桶的取(不用瓢,直接上桶从缸中取水),装满缓冲区(桶)然后才运送一次。如果说你非要理解为一瓢一瓢的取也可以说得过去,那么就是我们倒入缸中的时候,是一桶一桶倒进去的。那么自然就IO次数少了。
关于用时7毫秒的批量处理,可以理解为直接把水从一个缸倒入另一个缸,因为是把所有文件写进内存然后再一次性写入文件的。
希望我的回答可以帮助你。
这个问题首先要明白,读取和写入的过程;
知道运行内存吧???计算机为什么要运行内存呢???其实运行内存就是一个缓冲区!!
文件的读取和写入操作的过程是这样的:
(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
也就是说其实加上缓冲区,它用的已经不是和DataOutputStream一样的瓢了,它相当于用一个型号更大的东西舀水再倒。
或者假定都是瓢,系统耗时主要在于两个地方:1.从缸里取水,不管是一滴还是一瓢,2.往缸里倒水,同样不管一滴还是一瓢。DataOutputStream与BufferedOutputStream在取水过程中,耗时一样,都是一瓢一瓢取水,但是在倒水过程中,前者还是一瓢一瓢倒水,后者则换成了一桶一桶倒水,也就是节约的时间在于倒水的过程
文件传输基础——Java IO流
133754 学习 · 1030 问题
相似问题