SequenceInputStream----合并流


这个类的作用是将多个输入流合并成一个输入流,通过SequenceInputStream类包装后形成新的一个总的输入流

1.SequenceInputStream(InputStream s1,InputStream s2)和SequenceInputStream(Enumeration<? extends InputStream> e)

     第一个构造方法只能将两个输入流合并成一个总的输入流(SequenceInputStream),而第二个构造方法通过Enumeration枚举可以由vector集合添加多个输入流,从而可以将更多的输入流合并成一个总的输入流
     这里的Enumeration与Iterator迭代器是一样的效果,将Vector集合中的元素枚举出来
       
     (1)例:我在不同地方建立多个文件,通过多个流来读取后,在通过SequenceInputStream合并他们形成一个新的输入流

<span style="font-size:14px;">public static void main(String[] args)throws Exception{
          Vector<InputStream> vector = new Vector<InputStream>();
          vector.add(new FileInputStream("c:\\zhang.txt"));
          vector.add(new FileInputStream("c:\\wangwu.txt"));
          vector.add(new FileInputStream("d:\\lisi.txt"));
          //将vector集合中的元素保存到枚举中去
          Enumeration<InputStream> e = vector.elements();
          SequenceInputStream sis = new SequenceInputStream(e);
          FileOutputStream out = new FileOutputStream(new File("f:\\person.txt"));
         
          byte[] b = new byte[1024];
          int length = -1;
          while((length = sis.read(b))!=-1){
               out.write(b,0,length);
          }
          sis.close();
          out.close();
     } 
</span>

2.int  read()和read(byte[] b)方法
     因为也是字节输入流,所以操作的也是字节流对象,所以也有这两个常用的方法
     

3.close()方法
     这个方法关闭的是合并的所有流


有文件的合并,就有文件的切割,文件的切割可以在循环中进行new出输出流对象,事先定义一个指定大小的数组,不过这个数组是有大小规定的,如果太大就会内存溢出
     例:
public class TestFile{
     public static void main(String[] args)throws Exception{
          marge();
     }
    
     //分割方法
     public static void split()throws Exception{
          FileInputStream fis = new FileInputStream("c:\\1.avi");
          FileOutputStream fos = null;
          byte[] b = new byte[1024*1024*10];//10M
          int length = -1;
          int count = 1;
          while((length = fis.read(b))!=-1){
               //每个文件10M
               fos = new FileOutputStream("c:\\"+(count++)+".part");
               fos.write(b,0,length);
               fos.close();
          }
          fis.close();
     }
    
     //合并方法
     public static void marge()throws Exception{
          ArrayList<InputStream> list = new ArrayList<InputStream>();
          list.add(new FileInputStream("c:\\1.part"));
          list.add(new FileInputStream("c:\\2.part"));
         
          //因为在匿名函数中访问,所以需要final修饰
          final Iterator<InputStream> iterator = list.iterator();
          Enumeration<InputStream> e = new Enumeration<InputStream>(){
               public boolean hasMoreElements(){
                    return iterator.hasNext();
               }
               public InputStream nextElement(){
                    return iterator.next();
               }
          };
          SequenceInputStream sis = new SequenceInputStream(e);
          FileOutputStream fos = new FileOutputStream("c:\\3.avi");
          byte[] b = new byte[1024];
          int length = -1;
          while((length = sis.read(b))!=-1){
               fos.write(b,0,length);
          }
          sis.close();
          fos.close();
     }
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值