import java.util.*;
import java.io.*;
class CombFileDemo
{
public static void main(String[] args) throws IOException
{
//combFile_Vector();
String path = "splitFile\\";
String ansName = "Adele-Someone Like You.mp3";
String ansFilter = ".spl";
splitFile(path, ansName, ".spl");
String tagName = "Adele-Someone Like You(comb).mp3";
int splitCnt = 5;
combFile_ArrayList(path, tagName, ansFilter, splitCnt);
}
public static void combFile_Vector() throws IOException
{
FileInputStream fis1 = new FileInputStream("1.txt");
FileInputStream fis2 = new FileInputStream("2.txt");
FileInputStream fis3 = new FileInputStream("3.txt");
//用Vector是因为它有一个方法可以直接返回枚举类型.elements(),但是效率低.
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(fis1);
v.add(fis2);
v.add(fis3);
Enumeration <FileInputStream> er = v.elements();
SequenceInputStream sis = new SequenceInputStream(er); //构造函数结构枚举类型的参数.
FileOutputStream fos = new FileOutputStream("123.txt");
byte [] buf = new byte[1024];
int num = 0;
while((num = sis.read(buf)) != -1)
{
fos.write(buf, 0, num);
}
sis.close(); //关掉关联的三个流.
fos.close();
}
public static void combFile_ArrayList(String path, String tagName, String ansFilter, int cnt) throws IOException
{
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for (int x = 1; x <=cnt; x++)
{
al.add(new FileInputStream(path + x+ansFilter)); //在合并的文件名有规律的情况下.
}
final Iterator <FileInputStream> it = al.iterator();
//自定义一个枚举类型
Enumeration <FileInputStream> er = new Enumeration <FileInputStream> ()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement()
{
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(er); //构造函数结构枚举类型的参数.
FileOutputStream fos = new FileOutputStream(path + tagName);
byte [] buf = new byte[1024];
int num = 0;
while((num = sis.read(buf)) != -1)
{
fos.write(buf, 0, num);
}
sis.close(); //关掉关联的三个流.
fos.close();
}
//切割文件
public static void splitFile(String path, String fileName, String filter) throws IOException
{
FileInputStream fis = new FileInputStream(path + fileName);
byte[] b = new byte[1024*1024]; //按照1M的大小进行切割.
FileOutputStream fos = null;
int num = 0;
int len = 0;
while ((len = fis.read(b)) != -1)
{
fos = new FileOutputStream(path + (++num)+filter);
fos.write(b, 0, len);
fos.close();
}
fis.close();
}
}