[十五]javaIO之SequenceInputStream

功能簡介

 
SequenceInputStream  合併流
顧名思義,就是能夠吧兩個流合併起來
 
他並無很複雜,單純的很,僅僅實現了InputStream
image_5b992d23_58a2
他擁有兩個構造方法
把兩個InputStream 
或者一個InputStream類型的Enumeration中包含的全部的流
鏈接起來
public SequenceInputStream(Enumeration<? extends InputStream> e)
public SequenceInputStream(InputStream s1, InputStream s2) 
 

實現原理

所謂的鏈接,只是順序的讀取多個流而已
接下來,咱們詳細看下
內部包含一個in 以及一個Enumeration
in用來表示當前的流
Enumeration保存了全部的流
image_5b992d23_5e82
若是構造方法入參爲Enumeration
直接內部的Enumeration指向參數
image_5b992d23_25ec
若是傳遞的是兩個InputStream
建立一個Vector,將這兩個流添加到Vector中
而後調用Vector的elements 得到Enumeration
image_5b992d23_403e
 
能夠看獲得,構造方法中都調用了nextStream這個方法
他是用來給in賦值的
若是是第一次調用,in確定爲null,因此不會進入第一行的if   會從Enumeration中讀取一個流,賦值給in
若是是後來的調用,會把in指向的流進行close,而後在獲取下一個流
顯然,這個方法的場景就是構造方法執行以後的初始化
以及當一個流讀取數組結束以後,嘗試從下一個流讀取
image_5b992d23_6c8c
 
read()方法將會持續從in中讀取數據
從一個流讀取數據,若是不是-1 返回,若是是那麼更新當前的in 指向下一個流
而後若是in不爲null,進行讀取 若是不是-1 返回,若是是那麼更新當前的in 指向下一個流
.........
直到最後一個流, in就是一個遊標
image_5b992d23_4f03

多參數的也是相似
從流中讀取數據,若是讀取到了,返回n,數據寫入到字節數組b中了
若是n<=0 說明 當前的in讀取結束了
那麼調用nextStream 而後do  while循環讀取
image_5b992d23_25e6
 
 
由於in始終指向當前的流,若是當前流爲null,那麼的確沒有可用的
不然直接返回  in.available
image_5b992d23_4912
 
close方法更直接
從頭至尾經過nextStream遍歷一遍全部的流
nextStream方法會把當前的流close掉
也就完成了全部的流的關閉
image_5b992d23_3fff
 

總結

SequenceInputStream的使用比較簡單,只須要傳遞進入兩個流或者一個包含流的Enumeration便可
他的read方法與InputStream方法的語義是相同的
再就沒有任何難點了
換句話說,只要經過構造方法構造好了SequenceInputStream以後,就當作什麼都沒發生,他就是一個最基礎的InputStream
 
須要瞭解到,它內部的實現細節,就是不斷地循環遍歷內部的流
相關文章
相關標籤/搜索