A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

序列流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);
        }               
}       

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马