关闭

SequenceInputStream----合并流

标签: SequenceInputStream合
559人阅读 评论(0) 收藏 举报
分类:

这个类的作用是将多个输入流合并成一个输入流,通过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();
     }
    
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:63460次
    • 积分:1433
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:31篇
    • 译文:0篇
    • 评论:4条
    最新评论