28. Java IO: SequenceInputStream

想要查看此教程的目錄請點擊:Java IO教程目錄貼地址


SequenceInputStream可以將兩個或更多個InputStream合并成一個。它會首先讀取第一個的全部字節,然后第二個。這就是叫SequenceInputStream的原因,因為它是安順序讀取的。

SequenceInputStream例子

是時候通過一個例子來看如何使用它了。在使用之前得先在類里面導入這個:

import java.io.SequenceInputStream;

下面讓我們來看一個具體的例子:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(input1, input2);

int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}

例子中的java代碼首先實例化兩個InputStream。FileInputStream繼承自InputStream,所以它們可以用在sequenceInputStream中。
然后,例子創建了一個SequenceInputStream實例。利用兩個參數的構造方法,這兩個參數為InputStream類型,這就是如何合并兩個輸入流的辦法。
兩個InputStream實例可以被SequenceInputStream合并在一起就像一個連貫的流。當第二個流都被寫過之后,SequenceInputStream的read()方法就會返回 -1,就是其他的輸入流一樣。

合并更多數量的流

你可以有兩種辦法來來并不更多的流。第一種辦法就是把所有的實例放入一個Vector,然后把Vector傳給SequenceInputStream的構造方法。下面是其示例:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
InputStream input3 = new FileInputStream("c:\\data\\file3.txt");

Vector<InputStream> streams = new Vector<>();
streams.add(input1);
streams.add(input2);
streams.add(input3);

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(streams.elements()))
    
int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();

第二種辦法是把InputStream合并至SequenceInputStream,再將兩個InputStream合并至另一個SequenceInputStream,最后將兩個SequenceInputStream合并到一個SequenceInputStream中:

SequenceInputStream sequenceInputStream1 =
        new SequenceInputStream(input1, input2);

SequenceInputStream sequenceInputStream2 =
        new SequenceInputStream(input3, input4);

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(
            sequenceInputStream1, sequenceInputStream2)){

int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();

關閉SequenceInputStream

從SequenceInputStream讀取完數據后要記得關閉它。關閉的同時也會關閉在讀的InputStream示例。關閉只需要調用close()方法,就像下面的一樣:

sequenceInputStream.close();

在java7中你也可以用try-with-resources結構。下面代碼為如何使用此種結構來關閉流:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");

try(SequenceInputStream sequenceInputStream =
    new SequenceInputStream(input1, input2)){

    int data = sequenceInputStream.read();
    while(data != -1){
        System.out.println(data);
        data = sequenceInputStream.read();
    }
}

注意這并沒有任何顯式的調用close()方法。
也要注意FileInputStream的兩個示例并沒有放在try-with-resources代碼塊里。這意味著try-with-resources并不會自動關閉兩個FileInputStream。然而,當SequenceInputStream被關閉后它也會關閉它讀的InputStream,所以FileInputStream也會在SequenceInputStream關閉后被關閉。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容