本帖最后由 张向辉 于 2013-2-5 12:34 编辑
先上代码:- /*
- 需求:
- 1.把电影文件按照10M每单位的大小分隔.
- 2.然后把电影合并,保证其可以正常观看.
- */
- import java.io.*;
- import java.util.*;
- class FilmSplit
- {
- public static void filmSplit() throws IOException //切割
- {
- //new 字节输入流
- FileInputStream fis = new FileInputStream("F:\\1.MP4");
- //new 字节输出流
- FileOutputStream fos = null;
- //定义缓冲
- byte[] buf = new byte[1024*1024];
- //定义计数器
- int len = 0, time = 0, sum = 0;
- //此处while循环如何优化?
- while (sum < 4) //限定次数,不产生多余空白文件
- {
- fos = new FileOutputStream("F:\\split\\"+ (sum++) + ".part"); //先产生目的流
- while ((time < 10) && ((len = fis.read(buf)) != -1)) //再存入数据. 限定10M
- {
- time++;
- fos.write(buf, 0, len);
- }
- fos.close();
- time = 0;
- }
- fis.close();
- }
- public static void merge() throws IOException //合并
- {
- //new vector集合
- Vector<FileInputStream> v = new Vector<>();
- //循环添加源
- for(int x = 0; x < 4; x++)
- {
- v.add(new FileInputStream("F:\\split\\"+ x + ".part"));
- }
- //获取Enumeration枚举
- Enumeration<FileInputStream> en = v.elements();
- //合并流
- SequenceInputStream sis = new SequenceInputStream(en);
- //输出流
- FileOutputStream fos = new FileOutputStream("F:\\split\\kongfu.rmvb");
- byte[] buf = new byte[1024];
- int len = 0;
- while((len = sis.read(buf)) != -1)
- {
- fos.write(buf, 0, len);
- }
- fos.close();
- sis.close();
- }
- public static void main(String[] args) throws IOException
- {
- //filmSplit(); //切割
- merge(); //合并
- }
- }
复制代码 自己写了个小程序,按照毕老师的思路,但是现在遇到个小问题.
文件按体积大小切割没有问题了,但是,无法自动的控制切割的次数.
总是,切割次数要手动按照源文件大小来设定,如果设定的多了,就会产生很多空白文件.
如果,外循环通过 (len = sis.read(buf)) != -1 来判断的话,
那么内部循环的数据一直在存储同一次的数据.
就是把第一次数组内的数据存储10次后,才读取第二次. 囧~!
有何方法可以控制外循环? 来保证资源的合理利用还有次数控制呢?
-----------------------------
想到一方法:
先获取媒体源的字节数,然后再除以要切割的体积.
值为int,所以再加1. 这样就刚好可以装下媒体数据,而不会产生多余文件.
但是这样感觉好麻烦... |