功能簡介
SequenceInputStream 合併流
顧名思義,就是能夠吧兩個流合併起來
他並無很複雜,單純的很,僅僅實現了InputStream
他擁有兩個構造方法 把兩個InputStream 或者一個InputStream類型的Enumeration中包含的全部的流 鏈接起來 |
public SequenceInputStream(Enumeration<? extends InputStream> e) |
public SequenceInputStream(InputStream s1, InputStream s2) |
實現原理
所謂的鏈接,只是順序的讀取多個流而已
接下來,咱們詳細看下
內部包含一個in 以及一個Enumeration in用來表示當前的流 Enumeration保存了全部的流
![image_5b992d23_5e82 image_5b992d23_5e82](http://static.javashuo.com/static/loading.gif) |
若是構造方法入參爲Enumeration 直接內部的Enumeration指向參數
![image_5b992d23_25ec image_5b992d23_25ec](http://static.javashuo.com/static/loading.gif) |
若是傳遞的是兩個InputStream 建立一個Vector,將這兩個流添加到Vector中 而後調用Vector的elements 得到Enumeration
![image_5b992d23_403e image_5b992d23_403e](http://static.javashuo.com/static/loading.gif) |
能夠看獲得,構造方法中都調用了nextStream這個方法 他是用來給in賦值的 若是是第一次調用,in確定爲null,因此不會進入第一行的if 會從Enumeration中讀取一個流,賦值給in 若是是後來的調用,會把in指向的流進行close,而後在獲取下一個流 顯然,這個方法的場景就是構造方法執行以後的初始化 以及當一個流讀取數組結束以後,嘗試從下一個流讀取 |
![image_5b992d23_6c8c image_5b992d23_6c8c](http://static.javashuo.com/static/loading.gif) |
read()方法將會持續從in中讀取數據 從一個流讀取數據,若是不是-1 返回,若是是那麼更新當前的in 指向下一個流 而後若是in不爲null,進行讀取 若是不是-1 返回,若是是那麼更新當前的in 指向下一個流 ......... 直到最後一個流, in就是一個遊標 |
![image_5b992d23_4f03 image_5b992d23_4f03](http://static.javashuo.com/static/loading.gif) |
多參數的也是相似 從流中讀取數據,若是讀取到了,返回n,數據寫入到字節數組b中了 若是n<=0 說明 當前的in讀取結束了 那麼調用nextStream 而後do while循環讀取
![image_5b992d23_25e6 image_5b992d23_25e6](http://static.javashuo.com/static/loading.gif) |
由於in始終指向當前的流,若是當前流爲null,那麼的確沒有可用的 不然直接返回 in.available |
![image_5b992d23_4912 image_5b992d23_4912](http://static.javashuo.com/static/loading.gif) |
close方法更直接 從頭至尾經過nextStream遍歷一遍全部的流 nextStream方法會把當前的流close掉 也就完成了全部的流的關閉 |
![image_5b992d23_3fff image_5b992d23_3fff](http://static.javashuo.com/static/loading.gif) |
總結
SequenceInputStream的使用比較簡單,只須要傳遞進入兩個流或者一個包含流的Enumeration便可
他的read方法與InputStream方法的語義是相同的
再就沒有任何難點了
換句話說,只要經過構造方法構造好了SequenceInputStream以後,就當作什麼都沒發生,他就是一個最基礎的InputStream
須要瞭解到,它內部的實現細節,就是不斷地循環遍歷內部的流