目錄:系統學習 Java IO---- 目錄,概覽html
SequenceInputStream 能夠將兩個或多個其餘 InputStream 合併爲一個。 首先,SequenceInputStream 將讀取第一個 InputStream 中的全部字節,而後讀取第二個 InputStream 中的全部字節。 這就是它被稱爲 SequenceInputStream 的緣由,由於 InputStream 實例是按順序讀取的。
java
提一下,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 實例與 SequenceInputStream 組合在一塊兒。code
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(); } } }
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(); } }
其實直接傳進構造器的 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 關閉時,它還將關閉它從中讀取的 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; }