整理 Java I/O (七):合并流 - SequenceInputStream

有时候我们需要从多个输入流中读取数据,一个一个依次去读的话费时费力,所以 Java 提供了 SequenceInputStream 来帮助我们将多个输入流合并成一个输入流,SequenceInputStream 会从第一个输入流开始读取,达到末尾之后紧接着读取第二个输入流,以此类推直到末尾。

可以直接在构造方法的参数中指定两个输入流,也可以将多个输入流包装成一个 Enumeration 对象作为参数传入。

构造方法

  • SequenceInputStream(Enumeration<? extends InputStream> e)

    通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

  • SequenceInputStream(InputStream s1, InputStream s2)

    通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。

其他方法

  • available()

    返回不受阻塞地从当前底层输入流读取(或跳过)的字节数的估计值,方法是通过下一次调用当前底层输入流的方法。

  • close()

    关闭此输入流并释放与此流关联的所有系统资源。

  • read()

    从此输入流中读取下一个数据字节。

  • read(byte[] b, int off, int len)

    将最多 len 个数据字节从此输入流读入 byte 数组。

简单示例

public class SequenceInputStreamTest {

    private FileOutputStream fos1;
    private FileOutputStream fos2;
    private FileOutputStream fos3;
    private FileOutputStream fos4;

    private FileInputStream fis1;
    private FileInputStream fis2;
    private FileInputStream fis3;
    private FileInputStream fis4;

    private SequenceInputStream sis;

    public static void main(String[] args) {
        SequenceInputStreamTest sist = new SequenceInputStreamTest();
        sist.writeData();
        sist.readData();

    }

    private void writeData() {
        try {
            fos1 = new FileOutputStream(new File("D:\\data1.txt"));
            fos2 = new FileOutputStream(new File("D:\\data2.txt"));
            fos3 = new FileOutputStream(new File("D:\\data3.txt"));
            fos4 = new FileOutputStream(new File("D:\\data4.txt"));

            fos1.write("111111111".getBytes());
            fos2.write("222222222".getBytes());
            fos3.write("333333333".getBytes());
            fos4.write("444444444".getBytes());

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void readData() {
        try {
            fis1 = new FileInputStream(new File("D:\\data1.txt"));
            fis2 = new FileInputStream(new File("D:\\data2.txt"));
            fis3 = new FileInputStream(new File("D:\\data3.txt"));
            fis4 = new FileInputStream(new File("D:\\data4.txt"));

            sis = new SequenceInputStream(fis1, fis2);

            int length = 0;
            byte[] arr = new byte[2];
            while ((length = sis.read(arr)) != -1) {
                System.out.print(new String(arr, 0, length));
            }

            System.out.println();

            fis1 = new FileInputStream(new File("D:\\data1.txt"));
            fis2 = new FileInputStream(new File("D:\\data2.txt"));
            Vector<FileInputStream> vector = new Vector<FileInputStream>();
            vector.add(fis1);
            vector.add(fis2);
            vector.add(fis3);
            vector.add(fis4);
            Enumeration<FileInputStream> elements = vector.elements();

            sis = new SequenceInputStream(elements);
            while ((length = sis.read(arr)) != -1) {
                System.out.print(new String(arr, 0, length));
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1