SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
构造方法:
可以接收两个流,也可以接收枚举类型的多个流
SequenceInputStream(InputStream s1, InputStream s2)
SequenceInputStream(Enumeration
import java.io.*;
import java.util.*;
public class SequenceDemo {
public static void main(String[] args)throws IOException {
//split();
combine();
}
public static void split() throws IOException
{
FileInputStream sis = new FileInputStream("e://晴天.mp3"); //源
byte[] buf = new byte[1024*1024];
int len = 0;
int count = 1;
while((len=sis.read(buf))!=-1)
{
FileOutputStream fos = new FileOutputStream("e://"+(count++)+".part"); //目的,一次1MB
fos.write(buf,0,len);
fos.close(); //关闭当前.part文件
}
sis.close();
}
public static void combine()throws IOException
{
/*Vector<FileInputStream> v = new Vector<FileInputStream>();
for(int i = 0; i<3; i++)
v.add(new FileInputStream("e://"+i+".part"));
Enumeration<FileInputStream> en = v.elements();*/
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int i = 0; i<3; i++)
al.add(new FileInputStream("e://"+i+".part"));
final Iterator<FileInputStream> it = al.iterator();
//重写Enumeration接口的两个方法,把ArrayList变为枚举类型
//不直接使用vector是因为其效率太低
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fis = new FileOutputStream("e://test.mp3");
byte[] buf = new byte[1024*1024];
int len = 0;
while((len=sis.read(buf))!=-1)
{
fis.write(buf,0,len);
}
sis.close();
fis.close();
}
}
这种切割方法对音频视频文件应该不太好使,因为它们的组成比较复杂,简单的字节拆分会破坏原来的结构