系統學習 Java IO (五)----使用 SequenceInputStream 組合多個流

目錄:系統學習 Java IO---- 目錄,概覽html

SequenceInputStream 能夠將兩個或多個其餘 InputStream 合併爲一個。 首先,SequenceInputStream 將讀取第一個 InputStream 中的全部字節,而後讀取第二個 InputStream 中的全部字節。 這就是它被稱爲 SequenceInputStream 的緣由,由於 InputStream 實例是按順序讀取的。
imagejava

構造方法
  1. SequenceInputStream(InputStream s1, InputStream s2): 經過兩個參數初始化新建立的 SequenceInputStream(將按順序讀取這兩個參數,先讀取 s1,而後讀取 s2)
  2. SequenceInputStream(Enumeration<? extends InputStream> e): 經過枚舉對象來初始化新建立的 SequenceInputStream,該參數必須是生成運行時類型爲 InputStream 對象的 Enumeration 型參數。

提一下,Enumeration 接口是 Iterator 迭代器的「古老版本」;
把 2 個流結合的一個例子:函數

public class SequenceInputStreamExample {
    public static void main(String[] args) throws IOException {
        InputStream input1 = new FileInputStream("D:\\test\\1.txt");
        InputStream input2 = new FileInputStream("D:\\test\\2.txt");

        SequenceInputStream sequenceInputStream = new SequenceInputStream(input1, input2);
        int data = sequenceInputStream.read();
        while (data != -1) {
            System.out.print((char)data);
            data = sequenceInputStream.read();
        }
    }
}

這裏使用了第一個構造函數,直接接收 2 個流,並把他們合併成一個流返回,這樣能夠使用被組合的兩個 InputStream 實例,就像它是一個流同樣。可是在讀取完成以前,仍是不能夠關閉被組合的 2 個流,不然再進行讀取會拋出異常。學習

組合 2 個以上的 InputStream

能夠經過 2 種方式將兩個以上的 InputStream 實例與 SequenceInputStream 組合在一塊兒。code

  1. 第一種方法是將全部 InputStream 實例放入 Vector 中,並將 Vector.elements() 傳遞給 SequenceInputStream 構造函數。 下面是一個如何將 Vector 傳遞給 SequenceInputStream 構造函數的示例:
public class SequenceInputStreamExample {
    public static void main(String[] args) throws IOException {
        InputStream input1 = new FileInputStream("D:\\test\\1.txt");
        InputStream input2 = new FileInputStream("D:\\test\\2.txt");
        InputStream input3 = new FileInputStream("D:\\test\\3.txt");

        Vector<InputStream> streams = new Vector<>();
        streams.add(input1);
        streams.add(input2);
        streams.add(input3);
        // 利用 Vector 對象的 elements() 方法返回 enumeration 對象
        SequenceInputStream sequenceInputStream = new SequenceInputStream(streams.elements());
        int data = sequenceInputStream.read();
        while (data != -1) {
            System.out.print((char)data);
            data = sequenceInputStream.read();
        }
    }
}
  1. 第二種方法是將 InputStream 實例兩兩組合到 SequenceInputStream 實例中,而後再和其餘 SequenceInputStream 組合。 如下是實例:
public class SequenceInputStreamExample {
    public static void main(String[] args) throws IOException {
        InputStream input1 = new FileInputStream("D:\\test\\1.txt");
        InputStream input2 = new FileInputStream("D:\\test\\2.txt");
        InputStream input3 = new FileInputStream("D:\\test\\3.txt");

        SequenceInputStream sequenceInputStream1 = new SequenceInputStream(input1, input2);
        SequenceInputStream sequenceInputStream = new SequenceInputStream(sequenceInputStream1, input3);
        int data = sequenceInputStream.read();
        while (data != -1) {
            System.out.print((char)data);
            data = sequenceInputStream.read();
        }
        sequenceInputStream.close();
    }
}

image
其實直接傳進構造器的 2 個 InputStream ,也會被構造器內部包裝成一個 Vector 的。部分源碼以下:htm

public SequenceInputStream(InputStream s1, InputStream s2) {
        Vector<InputStream> v = new Vector<>(2);
        v.addElement(s1);
        v.addElement(s2);
        e = v.elements();
        try {
            nextStream();
關閉 SequenceInputStream

當 SequenceInputStream 關閉時,它還將關閉它從中讀取的 InputStream 實例,能夠調用 close() 方法,還能夠使用 Java 7 中引入的 try-with-resources 構造關閉。對象

public void close() throws IOException {
        do {
            nextStream();
        } while (in != null);
    }

final void nextStream() throws IOException {
        if (in != null) {
            in.close();
        }
        if (e.hasMoreElements()) {
            in = (InputStream) e.nextElement();
            if (in == null)
                throw new NullPointerException();
        }
        else in = null;
    }
相關文章
相關標籤/搜索