[七]JavaIO之 PipedInputStream 和 PipedInputStream

 

管道簡介

 

管道的含義,好久以前就已經出現java

用於表示數據直接交互數組

它的含義與平時說的管道的含義是相似的,就是直連緩存

JavaIO中的 PipedInputStream 和 PipedOutputStream 就是IO體系中字節流的管道多線程

 

 

 

 

java中,PipedOutputStream和PipedInputStream分別是管道輸出流和管道輸入流學習

使用管道通訊時,必須將PipedOutputStream和PipedInputStream配套使用spa

大體流程:操作系統

咱們在線程A中向PipedOutputStream中寫入數據,這些數據會自動的發送到與PipedOutputStream對應的PipedInputStream中,進而存儲在PipedInputStream的緩衝中;線程

線程B經過讀取PipedInputStream中的數據ip

對照到我上面畫的圖就是這樣:ci

雖說是管道,跟現實中的含義有些相似,可是也絕對不能認爲他們的數據流方向能夠任意

在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要求的是同樣的,沒什麼特別的

實現細節有興趣的能夠深刻研究

相關文章
相關標籤/搜索