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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pphdsny3 高级黑马   /  2012-8-21 10:46  /  1421 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马王鹏 于 2012-8-21 10:48 编辑
  1. import java.io.*;
  2. import java.util.*;
  3. public class splitFile {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws IOException{
  8.                 // TODO Auto-generated method stub
  9.                 spiltFile();
  10.         }
  11.         /**
  12.          * 切割文件
  13.          * @throws IOException
  14.          */
  15.         
  16.         public static void spiltFile()throws IOException{
  17.                 File avi = new File("C:\\1.avi");
  18.                 BufferedInputStream bufi = new BufferedInputStream(new FileInputStream(avi));
  19.                 BufferedOutputStream bufo = null;
  20.                 File f = new File("C:\\splitfile");
  21.                 if(!f.exists())
  22.                         f.mkdir();
  23.                
  24.                 byte[] buf = new byte[1024*1024];
  25.                 int len;
  26.                 int count = 1;
  27.                 int sum = 0;
  28.                 while((len=bufi.read(buf)) != -1){
  29.                 //把注释打开,直接切是没问题的
  30. /*        bufo = new BufferedOutputStream(new FileOutputStream(new File(f,count+".part")));
  31.                         bufo.write(buf, 0, len);
  32.                         bufo.close();
  33.                         count++;*/
  34.                         if(bufo == null)
  35.                                 bufo = new BufferedOutputStream(new FileOutputStream(new File(f,count+".part")));
  36.                         else{
  37.                                 //以10M为大小进行切割
  38.                                 if(sum < 10){
  39.                                         sum++;
  40.                                         bufo.write(buf, 0, len);
  41.                                 }else{
  42.                                         bufo.close();
  43.                                         bufo = null;
  44.                                         sum = 0;
  45.                                         count++;
  46.                                 }
  47.                         }               
  48.                 }
  49.                 bufo.close();
  50.                 bufi.close();
  51.         }
  52.         /**
  53.          * 合并文件
  54.          * @throws IOException
  55.          */
  56.         
  57.         public static void partToAli()throws IOException{
  58.                 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
  59.                 for(int i=1; i<44; i++){
  60.                         al.add(new FileInputStream(new File("C:\\splitfile\\"+i+".part")));
  61.                 }
  62.                 final Iterator<FileInputStream> it = al.listIterator();
  63.                 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
  64.                         public boolean hasMoreElements(){
  65.                                 return it.hasNext();
  66.                         }
  67.                         
  68.                         public FileInputStream nextElement(){
  69.                                 return it.next();
  70.                         }
  71.                 };
  72.                
  73.                 SequenceInputStream sis = new SequenceInputStream(en);
  74.                 BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream(new File("C:\\splitfile\\0.avi")));
  75.                 byte[] buf = new byte[1024*1024];
  76.                 int len = 0;
  77.                 while((len=sis.read(buf)) != -1){
  78.                         bufo.write(buf, 0, len);
  79.                 }
  80.                 bufo.close();
  81.                 sis.close();
  82.         }

  83. }
复制代码
我要切割一个视频文件,以10M为大小进行切割,我的缓冲区大小是1M,在一个文件中输入10次才行,上面是我的代码,结果切出来的文件和源文件大小不一样,大家看看是什么原因?
我不分开切,以一个文件1M的话切,又没有问题(注释的部分就这样切的)
下面截图是我的运行结果,两种明显不一致


评分

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

查看全部评分

5 个回复

倒序浏览
本帖最后由 王少岩 于 2012-8-21 13:02 编辑

以10M为大小进行切割的时候,当sum=10的时候,这次循环没有把缓冲数组里面的数据写到分割文件中,楼主的代码逻辑每循环10次就会漏写一次数据。
楼主代码
if(bufo == null)
       bufo = new BufferedOutputStream(new FileOutputStream(new File(f,count+".part")));
else{
//以10M为大小进行切割
       if(sum < 10){
               sum++;
               bufo.write(buf, 0, len);
        }else{//当sum=10的时候,执行此代码逻辑,在词逻辑中并没有写入操作,所以分割后的文件回避原文件小。
                bufo.close();
                bufo = null;
                sum = 0;
                count++;
          }
}
修改后:
if((bos == null)||(sum==10)){//判断条件加上sum==10,当sum=10的时候,也重新创建流对象,创建新文件,这样当sum=10的时候也有了写操作
       sum = 0;//主要是为了将sum=10重置为sum=0;
       bos = new BufferedOutputStream(new FileOutputStream(new File(parts,++count+".part")));
}
//以10M为大小进行切割
if(sum < 10){
       sum++;
       bos.write(buf, 0, len);
}         

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 加油

查看全部评分

回复 使用道具 举报
  1. if(bufo == null)  //这个if在这里没有意义,只判断,num的,数量就OK了,
  2.                                 bufo = new BufferedOutputStream(new FileOutputStream(new File(f,count+".part")));
  3.                         else{
  4.                                 //以10M为大小进行切割
  5.                                 if(sum < 10){
  6.                                         sum++;
  7.                                         bufo.write(buf, 0, len);
  8.                                 }else{
  9.                                         bufo.close();
  10.                                         bufo = null;
  11.                                         sum = 0;
  12.                                         count++;
  13.                                 }
复制代码
小于10 一直写,用while (num<10){
//加上写一M的代码,
}

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 加油

查看全部评分

回复 使用道具 举报
王少岩 发表于 2012-8-21 12:59
以10M为大小进行切割的时候,当sum=10的时候,这次循环没有把缓冲数组里面的数据写到分割文件中,楼主的代 ...

谢谢!原来时少写了几次数据!
回复 使用道具 举报
刘圣伟 发表于 2012-8-21 13:03
小于10 一直写,用while (num

谢谢!我判断了却没往里面写数据!
回复 使用道具 举报
问题已解决!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马