[十五]javaIO之SequenceInputStream
阿新 • • 發佈:2018-09-13
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指向的流進行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