A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 湛添友 中级黑马   /  2014-4-19 13:12  /  1394 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();不还是在循环吗?效率提高在哪里?

3 个回复

倒序浏览
如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里, 就使用byte数组,然后一次性写入,类似数据库的批量操作,这样效率比较高。
回复 使用道具 举报
两个虽然用的都是同一个方法read(),但是读写机制不一样。
没有缓冲区的,会每读一次就往硬盘里写一次,这样不但效率低而且对硬盘还不好。
有缓冲区的,就是会在内存里开辟一块区域暂时存放数据,然后每读一次就先把读到的数据写到这块区域里,等这个区域里的数据装满了,或者执行了flush()方法,这时才把数据一次性的写入硬盘里,这样效率显然提高了。
回复 使用道具 举报
BufferedInputStream这个类的构造方法参数是InputStream,是从流中读取字节,而不是从设备(比如:硬盘文件)读取,每次读取字节都是放在一个byte数组中,这个数据就是缓冲区。
  FileInputStream这个类的构造方法参数是File,每次都要从硬盘设备读取数据,而不是在以有流中,读取出来的数据还是放在byte数组中,这个数组,也是缓冲区。
  所以应根据选择进行流的包装,是读取文件,还是读取已有的流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马