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

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

//带缓冲字节流读取

 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 回答

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

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

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

(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 回复 有任何疑惑可以回复我~
#1

怒放的生命012

一定要告诉我最后的结果呀
2016-07-01 回复 有任何疑惑可以回复我~

比如说,

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

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

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

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

你这个比喻不够形象哦

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

你这个没有定义缓存size

要是想理解概念就好办


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

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

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

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


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

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

许晓涛

buff是缓冲区,就是说先把一粒一粒的芝麻捏到手里,再从手里直接到碗里,缓冲区啊
2015-11-30 回复 有任何疑惑可以回复我~

559bddad00012a9005000465.jpg

559bddad000156fe05000461.jpg

懂了吗????

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

随便学学 提问者

你这是根据代码结果去解释函数功能。 //带缓冲字节流读取 while((c=bis.read())!=-1){ //c=bis.read(),c是读到的字节 bos.write(c); //bos.write(c),实际操作是先读一批字节,缓冲区满后,再进行写操作 bos.flush(); //缓冲区功能再代码中没有体现 带缓冲区代码理解对吗?
2015-07-08 回复 有任何疑惑可以回复我~
#2

qq_木的three次方_0

我采用带缓冲区的批量字节数组赋值文件,竟然比不带缓冲区的批量字节数组效率低,这是为什么?
2015-10-08 回复 有任何疑惑可以回复我~
#3

qq_木的three次方_0

long start = System.currentTimeMillis(); FileDemo.CopyByBufferBuf(new File("E:\\java\\test.mp3"), new File("E:\\java\\dest4.mp3")); long end = System.currentTimeMillis(); System.out.print("缓冲区批量字节数组复制的时间"); System.out.println(end-start);
2015-10-08 回复 有任何疑惑可以回复我~
#4

qq_木的three次方_0

long start = System.currentTimeMillis(); FileDemo.copyfileByBuf(new File("E:\\java\\test.mp3"), new File("E:\\java\\dest1.mp3")); long end = System.currentTimeMillis(); System.out.print("字节数组批量复制的时间:"); System.out.println(end-start); }
2015-10-08 回复 有任何疑惑可以回复我~
#5

qq_木的three次方_0

缓冲区批量字节数组复制的时间31 字节数组批量复制的时间:16
2015-10-08 回复 有任何疑惑可以回复我~
查看2条回复

有图有真相

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

需要我的代码吗


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

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

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

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

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

举报

0/150
提交
取消

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

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