「布衣碼農」管道主要用於多線程間的通訊。 — 1 —java
管道的含義,好久以前就已經出現,用於表示數據直接交互。
它的含義與平時說的管道的含義是相似的,就是直連。JavaIO中的 PipedInputStream 和 PipedOutputStream 就是IO體系中字節流的管道。
java中,PipedOutputStream和PipedInputStream分別是管道輸出流和管道輸入流。
使用管道通訊時,必須將PipedOutputStream和PipedInputStream配套使用。大體流程:咱們在線程A中向PipedOutputStream中寫入數據,這些數據會自動的發送到與PipedOutputStream對應的PipedInputStream中,進而存儲在PipedInputStream的緩衝中;線程B經過讀取PipedInputStream中的數據;
對照到我上面畫的圖就是這樣:雖說是管道,跟現實中的含義有些相似,可是也絕對不能認爲他們的數據流方向能夠任意。在JavaIO中必須是一個線程經過PipedOutputStream 寫入數據,另外的線程經過與他相鏈接的PipedInputStream讀取數據。
— 2 —數組
PipedOutputStream 中有一個 pipedInputStreampipedInputStream 內部有一個字節數組 經過initPipe方法進行初始化
調用PipedOutputStream的write方法,實際上調用的是內部pipedInputStream 的 receive方法。而 receive方法,操做的正是pipedInputStream內部的字節數組。因此說,只須要使用connect把管道鏈接起來,就能夠經過PipedOutputStream 寫入數據,PipedOutputStream讀取數據。數據的中轉站,正是pipedInputStream 內的數組。
— 3 —緩存
剛纔已經介紹,PipedInputStream 內部維護了一個字節數組 buffer 默認大小爲1024,經過initPipe方法初始化。PipedOutputStream 和 PipedInputStream 他們其實操做的都是:PipedInputStream 中的buffer
一個讀一個寫,因此要記住讀和寫的位置。 注意此處的in和 out 是相對於 PipedInputStream 的buffer[] 來講的。因此in就是 PipedOutputStream 調用write最終使用的;out就是 PipedInputStream 自己read使用的;想要使用管道流必需要有鏈接的過程。能夠在建立 PipedInputStream 的同時一併鏈接,或者僅僅建立PipedInputStream 稍後鏈接。
並且內部字節數組的長度是能夠設置的,因此也就是又有了默認的或者設置的兩種形式,因此總共有四種形式的構造方法。readpublic synchronized int read() throws IOException 讀取一個字節public synchronized int read(byte b[], int off, int len) 讀取長度爲len的字節到字節數組b 從偏移量off開始寫入
available 獲取可用個數
close沒有系統資源須要關閉,可是仍是有些事情要作
connectconnect 調用的是PipedOutputStream中的connect方法
— 4 —多線程
內部須要PipedInputStream
構造方法也比較簡單建立一個PipeOutputStream或者建立的同時進行鏈接剛纔講過,PipedInputStream中的connect也是藉助於PipedOutputStream,他完成了真正的鏈接。看得出來,不能重複鏈接,不然會拋出異常。鏈接後,會對鏈接進來的PipedInputStream進行必要的初始化。主要就是 in和 out。另外標記已經鏈接,也正是用這個connected字段來校驗是否已經鏈接的。 write兩個版本的write方法write(int b) 寫入一個字節, 前面24位會被丟棄write(byte b[], int off, int len) 從指定字節數組的指定位置,讀取指定個數的字節, 寫入到流根本仍是調用的receive
flushflush 將數據輸出,此處不一樣於文件須要調用操做系統進行寫入磁盤須要通知讀線程進行讀取
close對於管道流的學習,只須要了解其根本便可:那就是PipedOutputStream 內部指向了一個 PipedInputStream ,藉助於PipedInputStream 內部的循環數組進行數據緩存,進而達到多線程通訊的目的。read 和 write方法的含義用法跟InputStream要求的是同樣的,沒什麼特別的,實現細節有興趣的能夠深刻研究。app
https://mp.weixin.qq.com/s/G_j2xNOFF3te66FS3Irn9Aide