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

来源:4-5 字节缓冲流

特地学java

2016-03-01 15:36

老师说:

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

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

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

写回答 关注

3回答

  • 顾小北
    2016-03-01 19:04:15
    已采纳

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

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

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


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


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

    怒放的生命0...

    这里的buffer可不可以理解成Stringbuffer中的buffer???

    2016-07-01 20:48:11

    共 2 条回复 >

  • 怒放的生命012
    2016-07-01 21:31:31

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

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

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

    (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


    染红_街道

    但是fileoutputstream 不是有 read(byte【】 b) 方法吗?他不是一次性读取很多, 怎么还会慢?? 还有一次全读完再写会怎样? randomAccessFile 的读写与这几个比较有啥区别

    2016-07-03 17:58:50

    共 1 条回复 >

  • 特地学java
    2016-03-02 09:33:53

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

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

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133754 学习 · 1030 问题

查看课程

相似问题