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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马刘杰 中级黑马   /  2013-2-27 00:43  /  2476 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马刘杰 于 2013-2-27 10:10 编辑

复习毕老师的IO视频,发现一个问题,如下一个完成文件复制的代码
  1. public static void copy() throws IOException{
  2.                 BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
  3.                 BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));
  4.                
  5.                 int by=0;
  6.                 //这里不还是从文件拿到一个字节到内存
  7.                 while((by=bufis.read())!=-1){
  8.                         //然后将内存中的by字节写入文件?这里没有用到缓存啊
  9.                         bufos.write(by);
  10.                 }
  11.                
  12.                 bufos.close();
  13.                 bufis.close();
  14.                
  15.         }
复制代码
如果把
  1. BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
  2. BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));
复制代码
替换成
  1. FileInputStream fis=new FileInputStream("c:\\3.mp3");
  2.                 FileOutputStream fos=new FileOutputStream("c:\\copy.mp3");
复制代码
是不是效果一样呢?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 李志卫 于 2013-2-27 03:56 编辑

FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileOutputStream("c:\\copy.mp3");

这个是一个一个字节从硬盘上读取没有错。

BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));

而这个,其实它是先从硬盘中读取一段数据(具体最大能读多大我忘记了),而这段数据就在内存中了,然后再用以下方法写入第二个硬盘地址中。
这样在硬件上硬盘就可以直接在一个区域读取一大片,写的时候也是在一个区域写一大片。不用读一个写一个,节约了时间。

       int by=0
           while((by=bufis.read())!=-1){

                        bufos.write(by);



实际上两个方法都是要一个字节一个字节读取的,也要一个字节一个字节写入(这是硬件的固有方式吧),不同的是有缓冲区的可以连续读取—储存—连续写入。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
就像大米饭如果一粒一粒拿会很慢,缓冲区就像饭勺可以一次性拿出一勺。
回复 使用道具 举报
李志卫 发表于 2013-2-27 03:54
FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileO ...

可是在while循环中,每写入一个字节就要回去再读一次,哪里连续读了?
回复 使用道具 举报
印象中FileOutputStream则是处理小数据模块。而BufferOutputStream是处理大数据模块的,数据量大的时候需要使用Buffer。两种InputStream亦是同理如上。

点评

鼓励个,请申请修改下会员名。  发表于 2013-2-27 11:20

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
李志卫 发表于 2013-2-27 03:54
FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileO ...

我明白了,老毕后面的视频也讲到了,谢谢你啊
回复 使用道具 举报
何伟 中级黑马 2013-2-27 20:15:20
7#
复制小文件可能看不出效果你可以复制大一点的文件,在复制时用System.currentTimeMillis()方法获得当前时间,复制完了再获得当前时间,在想减就可以看出效果
  1.         public static void main(String[] args) throws IOException {
  2.                 long start = System.currentTimeMillis();
  3.                  //把复制文件写成方法在这里掉用
  4.                  //可以把每一种复制方法都试试,
  5.                 long end = System.currentTimeMillis();
  6.                 System.out.println("共耗时:" + (end - start) + "毫秒");
  7.         }
复制代码
回复 使用道具 举报
何伟 发表于 2013-2-27 20:15
复制小文件可能看不出效果你可以复制大一点的文件,在复制时用System.currentTimeMillis()方法获得当前时间, ...

嗯,谢谢啊
回复 使用道具 举报
何伟 中级黑马 2013-2-27 23:31:45
9#
黑马刘杰 发表于 2013-2-27 23:20
嗯,谢谢啊

不用客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马