[七]JavaIO之 PipedInputStream 和 PipedInputStream
管道簡介
|
管道的含義,很久之前就已經出現 用於表示資料直接互動 |
它的含義與平時說的管道的含義是類似的,就是直連 JavaIO中的 PipedInputStream 和 PipedOutputStream 就是IO體系中位元組流的管道 |
java中,PipedOutputStream和PipedInputStream分別是管道輸出流和管道輸入流 |
使用管道通訊時,必須將PipedOutputStream和PipedInputStream配套使用 |
大致流程: 我們線上程A中向PipedOutputStream中寫入資料,這些資料會自動的傳送到與PipedOutputStream對應的PipedInputStream中,進而儲存在PipedInputStream的緩衝中; 執行緒B通過讀取PipedInputStream中的資料 |
對照到我上面畫的圖就是這樣: |
雖然說是管道,跟現實中的含義有些類似,但是也絕對不能認為他們的資料流方向可以任意 在JavaIO中必須是一個執行緒通過PipedOutputStream 寫入資料,另外的執行緒通過與他相連線的PipedInputStream讀取資料 |
實現原理
PipedOutputStream 中有一個 pipedInputStream pipedInputStream 內部有一個位元組陣列 通過initPipe方法進行初始化 |
呼叫PipedOutputStream的write方法,實際上呼叫的是內部pipedInputStream 的 receive方法 而 receive方法,操作的正是pipedInputStream內部的位元組陣列 所以說,只需要使用connect把管道連線起來 就可以通過PipedOutputStream 寫入資料,PipedOutputStream讀取資料 資料的中轉站,正是pipedInputStream 內的陣列 |
|
PipedInputStream
剛才已經介紹,PipedInputStream 內部維護了一個位元組陣列 buffer 預設大小為1024 通過initPipe方法初始化 |
PipedOutputStream 和 PipedInputStream 他們其實操作的都是 PipedInputStream 中的buffer 一個讀一個寫,所以要記住讀和寫的位置 注意 此處的in和 out 是相對於 PipedInputStream 的buffer[] 來說的 所以in就是 PipedOutputStream 呼叫write最終使用的 out就是 PipedInputStream 本身read使用的 |
想要使用管道流必須要有連線的過程 可以在建立 PipedInputStream 的同時一併連線 或者僅僅建立PipedInputStream 稍後連線 而且,內部位元組陣列的長度是可以設定的,所以也就是又有了預設的或者設定的兩種形式 所以總共有四種形式的構造方法 |
|
read
public synchronized int read() throws IOException 讀取一個位元組 |
public synchronized int read(byte b[], int off, int len) 讀取長度為len的位元組到位元組陣列b 從偏移量off開始寫入 |
available() 獲取可用個數 |
close() 沒有系統資源需要關閉,但是還是有些事情要做 |
connect
connect 呼叫的是PipedOutputStream中的connect方法 |
|
PipedOutputStream
內部需要PipedInputStream |
構造方法也比較簡單 建立一個PipeOutputStream或者建立的同時進行連線 |
剛才講過,PipedInputStream中的connect也是藉助於PipedOutputStream 他完成了真正的連線 看得出來,不能重複連線,否則會丟擲異常 連線後,會對連線進來的PipedInputStream進行必要的初始化 主要就是 in和 out 另外標記已經連線,也正是用這個connected欄位來校驗是否已經連線的 |
write
兩個版本的write方法 write(int b) 寫入一個位元組, 前面24位會被丟棄 write(byte b[], int off, int len) 從指定位元組陣列的指定位置,讀取指定個數的位元組, 寫入到流 根本還是呼叫的receive |
|
flush
flush 將資料輸出,此處不同於檔案需要呼叫作業系統進行寫入磁碟 需要通知讀執行緒進行讀取 |
|
close
對於管道流的學習,只需要瞭解其根本即可,那就是PipedOutputStream 內部指向了一個 PipedInputStream
藉助於 PipedInputStream 內部的迴圈陣列進行資料快取,進而達到多執行緒通訊的目的
read 和 write方法的含義用法跟InputStream要求的是一樣的,沒什麼特別的
實現細節有興趣的可以深入研究