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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z-翔 中级黑马   /  2014-8-6 22:59  /  1454 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 z-翔 于 2014-8-6 23:19 编辑

今天做复制MP3文件的练习的时候,发现的问题,请教下大家
为什么不刷新的话,复制的文件大小会比源文件小?
为什么加上flush就不会丢数据?
import java.io.*;
class CopyMp3
{
        public static void main(String[] args
        {
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try
                {
                        fis = new FileInputStream("f:\\KuGou\\Bandari - 雨的印记.mp3");
                        fos = new FileOutputStream("d:\\text\\Bandari - 雨的印记.mp3");
                        BufferedInputStream bis = new BufferedInputStream(fis);
                        BufferedOutputStream bos = new BufferedOutputStream(fos);
                        int b = 0;
                        while((b=bis.read())!=-1)
                        {
                                bos.write(b);
                                bos.flush();
                        }
                }
                catch(Exception e)
                {
                        throw new RuntimeException("复制失败");
                }
                finally
                {
                        try
                        {
                                if(fis!=null)
                                        fis.close();
                        }
                        catch(Exception e)
                        {
                                throw new RuntimeException("输入流关闭失败");
                        }
                        try
                        {
                                if(fos!=null)
                                        fos.close();
                        }
                        catch(Exception e)
                        {
                                throw new RuntimeException("输出流关闭失败");
                        }
                }
        }
}

10 个回复

倒序浏览
一般不会少的 你用flush跟没flush复制mp3都能用吗
回复 使用道具 举报
本帖最后由 masai158 于 2014-8-6 23:05 编辑

缓冲区,需要刷新后,才将数据写出。(提高效率嘛)

  1. byte[] b = new byte[1024*5];
  2.                         while((b=bis.read())!=-1)
  3.                         {
  4.                                 bos.write(b,0,b.length);
  5.                                 bos.flush();
  6.                         }
复制代码
回复 使用道具 举报
masai158 发表于 2014-8-6 23:03
缓冲区,需要刷新后,才将数据写出。(提高效率嘛)

哥们,这不是我问的重点
回复 使用道具 举报
790324255a 发表于 2014-8-6 23:01
一般不会少的 你用flush跟没flush复制mp3都能用吗

能用是能用,可是大小就是不一样啊
回复 使用道具 举报
你finally里关闭bos而不是fos应该就不会出现这个问题了
回复 使用道具 举报
fis.close();改为bis.close就不会了
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 23:11
你finally里关闭bos而不是fos应该就不会出现这个问题了

谢谢,原来是我代码写错了
回复 使用道具 举报


你的代码。什么都
回复 使用道具 举报
我发现用BufferedOutputStream缓冲区是不用缓冲区的3倍速度
回复 使用道具 举报
注意flush和close区别
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马