黑马程序员技术交流社区

标题: 为什么自定义字节流的缓冲区写入数据速度快呢?? [打印本页]

作者: Up↑Lee↗    时间: 2014-4-3 21:27
标题: 为什么自定义字节流的缓冲区写入数据速度快呢??
本帖最后由 Up↑Lee↗ 于 2014-4-5 08:32 编辑

方式2自定义字节流的缓冲区为什么比方式1BufferedInputStream 速度快??





  1. /*
  2. 演示mp3的复制。通过缓冲区。
  3. BufferedOutputStream
  4. BufferedInputStream


  5. */
  6. import java.io.*;
  7. class  CopyMp3
  8. {
  9.         public static void main(String[] args) throws IOException
  10.         {
  11.                 long start = System.currentTimeMillis();
  12. <font color="#ff0000">                copy_2();</font>
  13.                 long end = System.currentTimeMillis();

  14.                 System.out.println((end-start)+"毫秒");
  15.         }

  16.         public static void copy_2()throws IOException
  17.         {
  18.                 MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("C:\\彩虹.mp3"));
  19.                 BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("C:\\彩虹2.mp3"));
  20.                
  21.                 int by = 0;

  22.                 //System.out.println("第一个字节:"+bufis.myRead());

  23.                 while((by=bufis.myRead())!=-1)
  24.                 {
  25.                         bufos.write(by);   //read方法在提升,而write方法在强转。写入指定字节
  26.                 }

  27.                 bufos.close();
  28.                 bufis.myClose();
  29.         }

  30.         //通过字节流的缓冲区完成复制。
  31.         public static void copy_1()throws IOException
  32.         {
  33.                 BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("C:\\彩虹.mp3"));
  34.                 BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("C:\\彩虹3.mp3"));
  35.                
  36.                 int by = 0;

  37.                 while((by=bufis.read())!=-1)
  38.                 {
  39.                         bufos.write(by);
  40.                 }

  41.                 bufos.close();
  42.                 bufis.close();

  43.                
  44.         }
  45. }
复制代码




作者: shi0000    时间: 2014-4-4 09:51
    一般编程所说的缓冲区指的是内存缓冲区,这是程序所设置的一块内存区域,用来暂存从其他设备读入的数据或即将写入其他设备的数据。
而硬盘缓冲区有两种:
一是上面说的内存缓冲区,只是它是专门为读取或写入硬盘而设置的,因此可以简称为硬盘缓冲区。这个的例子是很多下载软件如迅雷中都有的磁盘缓存设置,即先将数据下载到内存中缓存起来,达到一定数量后再写到硬盘里,从而减少了读写硬盘的次数,达到保护硬盘的目的。
另一种是硬盘本身携带的一块随机存储器,大小通常为数MB到几十MB,这个是固化在硬盘内部的。它的作用和前一种类似,也是为了增加读写效率和保护硬盘,只是它是系统中所有程序所共用的,并且除了驱动程序外,通常的程序无法控制它。
作者: 苏伯亚    时间: 2014-4-4 09:52
因为如果没有缓冲区,应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,等到缓冲区有足够多的数据时,就整体写入设备。这样就提高了速度。
作者: Up↑Lee↗    时间: 2014-4-5 08:32
苏伯亚 发表于 2014-4-4 09:52
因为如果没有缓冲区,应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时 ...

:handshake
作者: 苏伯亚    时间: 2014-4-5 08:34
Up↑Lee↗ 发表于 2014-4-5 08:32

             :lol
作者: 山治0712    时间: 2014-4-5 14:19
因为把数据写到硬盘的时候很慢,所以就不一次一次的写到硬盘,而是一股脑的写到硬盘去,就像你去买菜,不是买一种放到家里了再去买,而是全买齐了再放到家里




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2