(十一)序列流

作者: 黒猫 | 来源:发表于2017-03-16 14:22 被阅读61次

    序列流SequnenceInputStream用来表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止,但序列流只能读取字节输入流。

    1、使用序列流实现将多个输入流写入到同一个文件

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.SequenceInputStream;
    import java.util.Enumeration;
    import java.util.Vector;
    
    public class Demo1 {
    
        public static void main(String[] args) throws IOException {
            // 先创字节输入流读取文件
            FileInputStream file1 = new FileInputStream("f:\\Demo1.java");
            FileInputStream file2 = new FileInputStream("f:\\Demo2.java");
            FileInputStream file3 = new FileInputStream("f:\\Demo3.java");
            /*
             * 根据序列流的构造方法
             * SequenceInputStream(Enumeration<? extends InputStream>e)
             * 表明要传入Enumeration类型的参数
             */
            // 将三个读取流都放到集合内
            Vector v = new Vector<>();
            v.add(file1);
            v.add(file2);
            v.add(file3);
            // 枚举
            Enumeration<FileInputStream> en = v.elements();
    
            // 创建序列流对象
            // 序列流会按顺序依次使用集合内的三个文件读取流读取文件
            SequenceInputStream sis = new SequenceInputStream(en);
            FileOutputStream fos = new FileOutputStream("F:\\Demo4.java");
            byte[] arr = new byte[1024];
            int len = 0;
            while ((len = sis.read(arr)) != -1) {
                fos.write(arr, 0, len);
            }
            // 关闭流
            sis.close();
            fos.close();
        }
    
    }
    
    

    2、实现上述功能的另一种枚举方法

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.SequenceInputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    
    public class Demo2 {
    
        public static void main(String[] args) throws IOException {
            // 使用Collections工具类的方法得到枚举
            ArrayList<FileInputStream> list = new ArrayList<>();
            list.add(new FileInputStream("F:\\Demo1.java"));
            list.add(new FileInputStream("F:\\Demo2.java"));
            list.add(new FileInputStream("F:\\Demo3.java"));
            Enumeration<FileInputStream> en = Collections.enumeration(list);
            // 创建序列流对象
            // 序列流会按顺序依次使用集合内的三个文件读取流读取文件
            SequenceInputStream sis = new SequenceInputStream(en);
            FileOutputStream fos = new FileOutputStream("F:\\Demo4.java");
            byte[] arr = new byte[1024];
            int len = 0;
            while ((len = sis.read(arr)) != -1) {
                fos.write(arr, 0, len);
            }
            // 关闭流
            sis.close();
            fos.close();
        }
    
    }
    

    版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作!             ↓↓↓
    

    相关文章

      网友评论

        本文标题:(十一)序列流

        本文链接:https://www.haomeiwen.com/subject/sgodnttx.html