带缓冲读写操作,“桶”的概念在哪体现?

来源:4-5 字节缓冲流

随便学学

2015-07-07 17:00

//带缓冲字节流读取

 BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
  int c;
  while((c=bis.read())!=-1){
   bos.write(c);
   bos.flush();

//不带缓冲的字节流读取

FileInputStream in=new FileInputStream(srcFile);
  FileOutputStream out=new FileOutputStream(destFile);
  int c;
  while((c=in.read())!=-1){
   out.write(c);
   out.flush();
  }

//具体读写操作时,read()方法返回的都是读取到的字节,write写入的也是读到的字节内容,为什么前者(带缓冲)比(不带缓冲)快?前者“桶”的概念在哪体现?盼快速回复,谢谢!

写回答 关注

9回答

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

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

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

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

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

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

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

    (2)文件的读取和写入

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

    2.再说批量读取,同理

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

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

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

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

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

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

    怒放的生命0...

    一定要告诉我最后的结果呀

    2016-07-01 21:29:17

    共 1 条回复 >

  • 许晓涛
    2015-07-08 09:51:27

    比如说,

    现在有一个水管,水流很慢,一滴一滴的流,然后你只能一滴一滴的喝。

    不过呢你有了一个杯子(BuffederInputStream)你可以让杯子一滴一滴的接着。

    什么时候不需要水了,拿起来直接喝掉。这就是缓冲区

  • 许晓涛
    2015-07-08 09:48:53

    你这个比喻不够形象哦

  • 管理員
    2015-07-08 09:42:23

    你这个没有定义缓存size

    要是想理解概念就好办


    100000个芝麻,从A碗到B碗问题

    没buff逻辑:一个一个拿过去

    buff逻辑:一把一把(10000个)抓过去

    (抓过去的路上浪费了很多时间)


    产生区别的原因其实很复杂。没buff浪费时间主要是IO操作次数太多(IO操作往往是效率瓶颈)

    许晓涛

    buff是缓冲区,就是说先把一粒一粒的芝麻捏到手里,再从手里直接到碗里,缓冲区啊

    2015-11-30 18:26:21

    共 1 条回复 >

  • 许晓涛
    2015-07-07 22:10:41

    559bddad00012a9005000465.jpg

    559bddad000156fe05000461.jpg

    懂了吗????

    qq_木的t...

    缓冲区批量字节数组复制的时间31 字节数组批量复制的时间:16

    2015-10-08 23:43:09

    共 5 条回复 >

  • 许晓涛
    2015-07-07 22:09:20

    有图有真相

  • 许晓涛
    2015-07-07 22:09:01

    需要我的代码吗


  • 许晓涛
    2015-07-07 22:06:05

    刚刚我自己实验了一番,用缓冲区复制相同文件用来195毫秒,不使用缓冲区用了400毫秒左右,因为不稳定,但是都在那个范围之间。

  • 许晓涛
    2015-07-07 21:41:42

    你可以这样试试,写一个复制文件的代码一个用缓冲区一个不使用缓冲区,并在开始复制是记录时间,结束后记录时间,看看那个快。如果不会使用java中获取当前时间的方法的话,自己去找吧

文件传输基础——Java IO流

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

133755 学习 · 1030 问题

查看课程

相似问题