序列流SequenceInputStream,可以通过构造函数SequenceInputStream(Enumeration<? extends InputStream>)对多个输入流进行合并,可以通过Vector.elements()获得Enumeration对象,SequenceInputStream 没有对应的OutputStream。
需求:切割文件并恢复,恢复文件的过程:用ArrayList存储InputStream(不用Vector,因为ArrayList效率较高),创建一个Enumeration(因为序列流构造函数需要Enumeration对象),覆盖Enumeration对象中的迭代器操作方法,将Enumeration对象中的迭代器操作方法方法基于ArrayList中迭代器操作来完成。
代码如下:
import java.io.*;
import java.util.*;
class mysplit{
static List<File> mysplit(File file,List<File> li){//对file进行切割,切割后的文件存储在li中
int i=0;
FileInputStream in=null;
try{
in=new FileInputStream(file);
FileOutputStream out=null;
byte[] buff=new byte[1024*20];//每个切割文件大小不超过20KB
File f=null;
int len=0;
while((len=in.read(buff))!=-1){
f=new File((++i)+".part");//每次切割都要创建一个新文件
out=new FileOutputStream(f);
out.write(buff,0,len);
li.add(f);//将本次切割后得到的文件存入li中
}
}catch(IOException e){
throw new RuntimeException(e);
}finally{
if(in!=null)
try{
in.close();
}catch(IOException e){
throw new RuntimeException(e);
}
}
return li;
}
}
class mymerge{
static void mymerge(List<File> li){
File result=new File("merge.jpg");
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
//将li中存储的切割文件对象一一取出,并分别用输入流关联
for(int i=0;i<li.size();i++){
try{
al.add(new FileInputStream(li.get(i)));
}catch(IOException e){
throw new RuntimeException(e);
}
}
Iterator<FileInputStream> it=al.iterator();
SequenceInputStream si=null;
FileOutputStream fos=null;
try{ //定义一个序列流,用ArrayList替代Enumeration做参数,效率更高,内部调用ArrayList中迭代器的操作完成
si=new SequenceInputStream(new Enumeration<FileInputStream>(){
public boolean hasMoreElements(){
return it.hasNext();
}
public FileInputStream nextElement(){
return it.next();
}
});
fos=new FileOutputStream(result);
byte[] buff=new byte[1024];
while(si.read(buff)!=-1){
fos.write(buff);
}
}catch(IOException e){
throw new RuntimeException(e);
}finally{
if(si!=null)
try{
si.close();
}catch(IOException e){
throw new RuntimeException(e);
}finally{
if(fos!=null)
try{
si.close();
}catch(IOException e){
throw new RuntimeException(e);
}
}
}
}
public static void main(String[] args){
List<File> li=new ArrayList<File>();
mysplit.mysplit(new File("test.jpg"),li);
mymerge(li);
}
} |
|