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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

学习了JAVA基础的sequenceInputStream后自己写个个分割视频和合并视频的程序,可是每次分割后大小就变化了。合并后也不是原视频了。求解?
  1. public static void merge() throws IOException{
  2.                 ArrayList<FileInputStream> list=new ArrayList<FileInputStream>();
  3.                 for(int i=0;i<12;i++){
  4.                         list.add(new FileInputStream("E:\\myeclipseJava\\day20\\"+(i+1)+".part"));
  5.                 }
  6.                 final Iterator<FileInputStream> it=list.iterator();
  7.                 Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() {

  8.                         @Override
  9.                         public boolean hasMoreElements() {
  10.                                 // TODO Auto-generated method stub
  11.                                 return it.hasNext();
  12.                         }

  13.                         @Override
  14.                         public FileInputStream nextElement() {
  15.                                 // TODO Auto-generated method stub
  16.                                 return it.next();
  17.                         }
  18.                 };
  19.                 SequenceInputStream sis=new SequenceInputStream(en);
  20.                 BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("E:\\myeclipseJava\\day20\\temp.rmvb"));
  21.                 byte[] byts=new byte[1024*1024];
  22.                 int len=0;
  23.                 while((len=sis.read(byts))!=-1){
  24.                         bos.write(byts, 0, len);
  25.                 }
  26.                 sis.close();
  27.                 bos.close();
  28.         }
  29.         public static void part(){
  30.                 BufferedInputStream fis=null;
  31.                 BufferedOutputStream fos=null;
  32.                 try{
  33.                         fis=new BufferedInputStream(new FileInputStream("E:\\myeclipseJava\\day20\\0.rmvb"));
  34.                         byte[] byts=new byte[1024*1024*2];
  35.                         int len=0;
  36.                         int count=1;
  37.                         int sum=0;
  38.                         while((len=fis.read(byts))!=-1){
  39.                                 if(sum==0){
  40.                                         fos=new BufferedOutputStream(new FileOutputStream("E:\\myeclipseJava\\day20\\"+(count++)+".part"));
  41.                                         fos.write(byts, 0, len);
  42.                                         sum++;
  43.                                 }else if(sum<50&&sum>0){
  44.                                         fos.write(byts,0,len);
  45.                                         sum++;
  46.                                 }else{
  47.                                         fos.close();
  48.                                         sum=0;
  49.                                 }
  50.                         }
  51.                 }catch(IOException e){
  52.                         throw new RuntimeException("wrong");
  53.                 }finally{
  54.                         if(fis!=null){
  55.                                 try{
  56.                                         fis.close();
  57.                                 }catch(IOException e){
  58.                                         e.getStackTrace();
  59.                                 }
  60.                         }
  61.                         if(fos!=null){
  62.                                 try{
  63.                                         fis.close();
  64.                                 }catch(IOException e){
  65.                                         e.getStackTrace();
  66.                                 }
  67.                         }
  68.                 }
  69.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

1 个回复

倒序浏览
本帖最后由 戏言丶 于 2014-10-18 02:52 编辑

你分割方法中的循环写入错了,只new了一次输出流,下面是我写的,可以参考参考
虽然懒了点,但是还是加下注释
  1. import java.io.*;
  2. import java.util.*;

  3. class SplitFile
  4. {
  5.         public static void main(String[] args) throws IOException
  6.         {
  7.                 //splitFile();
  8.                 merge();
  9.         }

  10.         public static void merge() throws IOException
  11.         {
  12.                 File file = new File("E:\\HM\\day24");
  13.                
  14.                 //找出分割为.part的文件
  15.                 File[] files = file.listFiles(new FilenameFilter()
  16.                 {
  17.                         public  boolean accept(File dir, String name)
  18.                         {
  19.                                 return name.endsWith(".part");
  20.                         }
  21.                 });

  22.                 long l = 0;

  23.                 //计算所有分割文件的总大小
  24.                 for (int i=0;i<files.length ; i++)
  25.                 {
  26.                         l = l+files[i].length();
  27.                 }
  28.                 //算出分割文件的数量
  29.                 int p = (int)l/(1024*1024*2)+1;

  30.                 //创建集合,里面存放文件流
  31.                 ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();

  32.                 //将分割的文件名存入集合中
  33.                 for(int i=1;i<=p;i++)
  34.                 {
  35.                         list.add(new FileInputStream(i+".part"));
  36.                 }

  37.                 final Iterator<FileInputStream> it = list.iterator();

  38.                 //枚举所有的分割文件
  39.                 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
  40.                 {
  41.                         public boolean hasMoreElements()
  42.                         {
  43.                                 return it.hasNext();
  44.                         }

  45.                         public FileInputStream nextElement()
  46.                         {
  47.                                 return it.next();
  48.                         }
  49.                 };
  50.                
  51.                 //将分割文件串联
  52.                 SequenceInputStream sis = new SequenceInputStream(en);

  53.                 //创建缓冲输出流,并关联目的文件
  54.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("temp.avi"));

  55.                 byte[] buf = new byte[1024*1024];
  56.                 int len = 0;

  57.                 //将分割文件读取并写入目的文件中
  58.                 while((len=sis.read(buf))!=-1)
  59.                 {
  60.                         bos.write(buf, 0, len);
  61.                 }
  62.                 sis.close();
  63.                 bos.close();
  64.         }

  65.         public static void splitFile() throws IOException
  66.         {
  67.                 //创建缓冲流,并关联源文件
  68.                 BufferedInputStream fis = new BufferedInputStream(new FileInputStream("1.avi"));
  69.                 BufferedOutputStream fos = null;

  70.                 byte[] byts = new byte[1024*1024*2];
  71.                 int len = 0;
  72.                 int count = 1;

  73.                 //将源文件分割保存
  74.                 while((len=fis.read(byts))!=-1)
  75.                 {
  76.                         fos = new BufferedOutputStream(new FileOutputStream((count++)+".part"));
  77.                         fos.write(byts, 0, len);
  78.                         fos.close();
  79.                 }
  80.                 fis.close();
  81.                 fos.close();
  82.         }
  83. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2 赞一个!

查看全部评分

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