黑马程序员技术交流社区

标题: IO流中缓冲区的原理? [打印本页]

作者: 湛添友    时间: 2014-4-19 13:12
标题: IO流中缓冲区的原理?
package iobytesteram;
//复制一个mp3
import java.io.*;
public class CopyMp3
{
        public static void main(String agrs[])throws IOException
        {
                BufferedInputStream bfis=new BufferedInputStream(new FileInputStream("D:\\音乐\\5 - 时间都去哪了.mp3"));
                BufferedOutputStream bfos=new BufferedOutputStream(new FileOutputStream("D:\\时间都去哪了.mp3"));
                int x=0;
                while((x=bfis.read())!=-1)
                        bfos.write(x);
                bfis.close();
                bfos.close();
        }
}


public static void read_1()throws IOException
        {
                FileInputStream fis=new FileInputStream("D:\\jav.txt");//关联一个文件
                int x=0;
                while((x=fis.read())!=-1)
                {
                        System.out.println((char)x);
                }
                fis.close();
        }



对于 这个 bfis.read(); 复写fis.read();其中原理是什么呢?
这两个read方法没什么区别?
bfis.read();不还是在循环吗?效率提高在哪里?
作者: ノtrack    时间: 2014-4-19 13:17
如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里, 就使用byte数组,然后一次性写入,类似数据库的批量操作,这样效率比较高。
作者: 清风夜独醉    时间: 2014-4-19 13:37
两个虽然用的都是同一个方法read(),但是读写机制不一样。
没有缓冲区的,会每读一次就往硬盘里写一次,这样不但效率低而且对硬盘还不好。
有缓冲区的,就是会在内存里开辟一块区域暂时存放数据,然后每读一次就先把读到的数据写到这块区域里,等这个区域里的数据装满了,或者执行了flush()方法,这时才把数据一次性的写入硬盘里,这样效率显然提高了。
作者: 曹冬明    时间: 2014-4-19 13:51
BufferedInputStream这个类的构造方法参数是InputStream,是从流中读取字节,而不是从设备(比如:硬盘文件)读取,每次读取字节都是放在一个byte数组中,这个数据就是缓冲区。
  FileInputStream这个类的构造方法参数是File,每次都要从硬盘设备读取数据,而不是在以有流中,读取出来的数据还是放在byte数组中,这个数组,也是缓冲区。
  所以应根据选择进行流的包装,是读取文件,还是读取已有的流。




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