1. 程式人生 > >[十五]javaIO之SequenceInputStream

[十五]javaIO之SequenceInputStream

div 取數據 read 細節 復雜 pla inline seq edi

功能簡介

SequenceInputStream 合並流 顧名思義,就是可以吧兩個流合並起來 他並沒有很復雜,單純的很,僅僅實現了InputStream 技術分享圖片
他擁有兩個構造方法
把兩個InputStream
或者一個InputStream類型的Enumeration中包含的所有的流
連接起來
public SequenceInputStream(Enumeration<? extends InputStream> e)
public SequenceInputStream(InputStream s1, InputStream s2)

實現原理

所謂的連接,只是順序的讀取多個流而已 接下來,我們詳細看下
內部包含一個in 以及一個Enumeration
in用來表示當前的流
Enumeration保存了所有的流
技術分享圖片
如果構造方法入參為Enumeration
直接內部的Enumeration指向參數
技術分享圖片
如果傳遞的是兩個InputStream
創建一個Vector,將這兩個流添加到Vector中
然後調用Vector的elements 獲得Enumeration
技術分享圖片
可以看得到,構造方法中都調用了nextStream這個方法
他是用來給in賦值的
如果是第一次調用,in肯定為null,所以不會進入第一行的if 會從Enumeration中讀取一個流,賦值給in
如果是後來的調用,會把in指向的流進行close,然後在獲取下一個流
顯然,這個方法的場景就是構造方法執行之後的初始化
以及當一個流讀取數組結束之後,嘗試從下一個流讀取
技術分享圖片
read()方法將會持續從in中讀取數據
從一個流讀取數據,如果不是-1 返回,如果是那麽更新當前的in 指向下一個流
然後如果in不為null,進行讀取 如果不是-1 返回,如果是那麽更新當前的in 指向下一個流
.........
直到最後一個流, in就是一個遊標
技術分享圖片

多參數的也是類似
從流中讀取數據,如果讀取到了,返回n,數據寫入到字節數組b中了
如果n<=0 說明 當前的in讀取結束了
那麽調用nextStream 然後do while循環讀取
技術分享圖片
因為in始終指向當前的流,如果當前流為null,那麽的確沒有可用的
否則直接返回 in.available
技術分享圖片
close方法更直接
從頭到尾通過nextStream遍歷一遍所有的流
nextStream方法會把當前的流close掉
也就完成了所有的流的關閉
技術分享圖片

總結

SequenceInputStream的使用比較簡單,只需要傳遞進入兩個流或者一個包含流的Enumeration即可 他的read方法與InputStream方法的語義是相同的 再就沒有任何難點了 換句話說,只要通過構造方法構造好了SequenceInputStream之後,就當做什麽都沒發生,他就是一個最基礎的InputStream 需要了解到,它內部的實現細節,就是不斷地循環遍歷內部的流

[十五]javaIO之SequenceInputStream