黑马程序员技术交流社区

标题: flush问题 [打印本页]

作者: z-翔    时间: 2014-8-6 22:59
标题: flush问题
本帖最后由 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("输出流关闭失败");
                        }
                }
        }
}


作者: 790324255a    时间: 2014-8-6 23:01
一般不会少的 你用flush跟没flush复制mp3都能用吗
作者: masai158    时间: 2014-8-6 23:03
本帖最后由 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.                         }
复制代码

作者: z-翔    时间: 2014-8-6 23:07
masai158 发表于 2014-8-6 23:03
缓冲区,需要刷新后,才将数据写出。(提高效率嘛)

哥们,这不是我问的重点
作者: z-翔    时间: 2014-8-6 23:09
790324255a 发表于 2014-8-6 23:01
一般不会少的 你用flush跟没flush复制mp3都能用吗

能用是能用,可是大小就是不一样啊
作者: fantacyleo    时间: 2014-8-6 23:11
你finally里关闭bos而不是fos应该就不会出现这个问题了
作者: 陈云阳    时间: 2014-8-6 23:16
fis.close();改为bis.close就不会了
作者: z-翔    时间: 2014-8-6 23:18
fantacyleo 发表于 2014-8-6 23:11
你finally里关闭bos而不是fos应该就不会出现这个问题了

谢谢,原来是我代码写错了
作者: masai158    时间: 2014-8-6 23:18


你的代码。什么都

作者: Bule丶    时间: 2014-8-6 23:21
我发现用BufferedOutputStream缓冲区是不用缓冲区的3倍速度
作者: David.L    时间: 2014-8-6 23:58
注意flush和close区别




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