1. 若要将一个文件分割为数个文件,再将之组合还原为一个文件,基本作法是使用数个FileInputStream来打开分割后的文件,然后一个一个文件的读取,并使用同一个FileOutputStream实例写到同一个文件中。必须自行判断每一个分割文件的读取是否完毕,如果完毕就读取下一个文件。如果使用java.io.SequenceInputStream就不用这么麻烦,SequenceInputStream可以看作是数个InputStream对象的组合。当一个InputStream对象的内容读取完毕后,它就会取出下一个InputStream对象,直到所有的InputStream对象都读取完毕为止。以下代码是SequenceInputStream的使用示范,可以将指定的文件进行分割,也可以将分割后的文件还原为一个文件:
package ysu.hxy;
import java.util.*;
import java.io.*;
public class SequenceStreamDemo
{
public static void main(String[] args)
{
try
{
//args[0]:指定分割(s)或连接(c)
switch(args[0].charAt(1))
{
case 's':
//args[1]: 每个分割文件的大小
int size = Integer.parseInt(args[1]);
//args[2]: 指定要被分割的文件名称
seperate(args[2],size);
break;
case 'c':
//args[1]: 指定要被组合的文件个数
int number = Integer.parseInt(args[1]);
//args[2]: 组合后的文件名称
concatenate(args[2],number);
break;
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Using: java UseSequenceStream [-s/-c]" +
"(Size/number) filename");
System.out.println("-s:分割文件\n-c:组合文件");
}
catch(IOException e)
{
e.printStackTrace();
}
}
//分割文件
public static void seperate(String filename,int size) throws IOException
{
FileInputStream fileInputStream = new FileInputStream(new File(filename));
BufferedInputStream bufInputStream = new BufferedInputStream(fileInputStream);
byte[] data = new byte[1];
int count = 0;
//还原文件大小及指定分割的大小
//决定要分割为几个文件
if(fileInputStream.available()%size == 0)
count = fileInputStream.available()/size;
else
count = fileInputStream.available()/size+1;
//开始进行分割
for(int i=0;i<count;i++)
{
int num = 0;
//分割的文件加上下划线与编号
File file = new File(filename + "_" + (i+1));
BufferedOutputStream bufOutputStream = new BufferedOutputStream(new FileOutputStream(file));
while(bufInputStream.read(data)!=-1)
{
bufOutputStream.write(data);
num++;
if(num==size)
{
//分割出一个文件
bufOutputStream.flush();
bufOutputStream.close();
break;
}
}
// 如果最后一次不够size指定的长度时需要处理
if(num < size)
{
bufOutputStream.flush();
bufOutputStream.close();
}
}
System.out.println("分割为:"+count+"个文件");
}
//连接文件
public static void concatenate(String filename,int number) throws IOException
{
//收集文件用的List
List<InputStream> list = new ArrayList<InputStream>();
for(int i=0;i<number;i++)
{
//文件名必须为下划线加上编号
File file = new File(filename+"_"+(i+1));
list.add(i,new FileInputStream(file));
}
final Iterator<InputStream> iterator = list.iterator();
//SequenecInputStream需要一个Enumeration对象来构建
Enumeration<InputStream> enumation = new Enumeration<InputStream>()
{
public boolean hasMoreElements()
{
return iterator.hasNext();
}
public InputStream nextElement()
{
return iterator.next();
}
};
//建立SequenceInputStream
//并使用BufferedInputStream
BufferedInputStream bufInputStream =
new BufferedInputStream(new SequenceInputStream(enumation),8192);
BufferedOutputStream bufOutputStream =
new BufferedOutputStream(new FileOutputStream(filename),8192);
byte[] data = new byte[1];
//读取所有文件数据并写入目的地文件
while(bufInputStream.read(data)!=-1)
bufOutputStream.write(data);
bufInputStream.close();
bufOutputStream.flush();
bufOutputStream.close();
System.out.println("组合" + number + "个文件OK!!!");
}
}
编译运行: D:\hxy>java ysu.hxy.SequenceStreamDemo -s 10000 ysu.rar
分割为:3个文件
D:\hxy>java ysu.hxy.SequenceStreamDemo -c 3 ysu.rar
组合3个文件OK!!!