[十九]JavaIO之PipedReader 和 PipedWriter


功能簡介


還記得PipedInputStream  和 PipedOutputStream麼
咱們以前是這麼說的:

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

大體流程: web

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

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

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

image_5b9a0f61_339d



咱們如今看下PipedReader  和    PipedWriter的關鍵的成員變量
你應該能夠想獲得
他們的實現邏輯跟PipedInputStream和PipeOutputStream是相似的
image_5b9a0f61_6f4d

image_5b9a0f61_4253



PipedReader   PipedWriter 基本原理和工做流程
PipedWriter中有一個 PipedReader sink成員變量
PipedReader 中有一個緩衝區char buffer[]   能夠用於保存數據

他們本質上操做的都是這個緩衝區
PipedReader操做的本身的緩衝區
PipedWriter 操做的是PipedReader 的緩衝區

PipedWriter 須要和PipedReader進行鏈接,或者在構造的時候直接鏈接
鏈接以後,就造成了一個管道   (其實就是PipedWriter  內部能夠調用PipedReader 的方法)
PipedWriter 寫入的數據,能夠經過PipedReader  進行讀取

構造方法


PipedReader 在構造的時候能夠指定緩衝區大小,不指定則使用默認值
也能夠在構造的時候就鏈接到一個PipedWriter 或者後續再鏈接
因此構造方法有四種形式
指定緩衝區大小, 不鏈接
默認緩衝區大小, 不鏈接
指定緩衝區大小, 鏈接
默認緩衝區大小, 鏈接
image_5b9a0f61_62ac



對於PipedWriter 有兩種形式
單純的建立一個PIpedWriter
或者建立的同時一併鏈接到一個PipedReader
image_5b9a0f61_7253


其餘方法


connect
connect方法,根本形式只有一種

無論是PipedWriter鏈接PipedReader     仍是 PipedReader  鏈接 PipedReader

image_5b9a0f61_7a7c
首先真正的將PipedReader和PipedWriter進行鏈接,也就是設置sink
而後就是設置in和out 他們是寫入PipedReader中的緩衝區和從緩衝區讀取的索引號
而後就是標誌已經鏈接成功了



除了上面介紹的方法之外,就是常規的Reader 和 Writer方法了,他們的語義不變

PipedWriter 提供了兩個版本的write方法
寫入一個字符
或者寫入一些字符 從cbuf[] off偏移量開始的len個字符

public void write(int c)  throws IOException
public void write(char cbuf[], int off, int len) throws IOException
 
image_5b9a0f61_6116
看得出來,PipedReader也是有一個receive方法,用來寫入緩衝區


PipedReader 提供了兩個版本的read方法
讀取一個字符
或者讀取指定個數的字符數目   保存到指定的數組,到她的指定的位置
public synchronized int read()  throws IOException
public synchronized int read(char cbuf[], int off, int len)  throws IOException
 


PipedReader 提供了ready
in是寫入數據的下一個索引值,默認是-1
若是小於0 顯然沒有任何數據已經被寫入,也就是PipedReader中的緩衝區中並無數據
也就是沒ready
 
image_5b9a0f61_2ba


PipedReader 也提供了常規的close方法

PipedWriter 也提供了常規的close  和 flush方法

總結


對於PipedReader和PipedWriter 要理解根本原理
PipedReader內部維護了一個緩衝區 PipedWriter 內部包含了一個PipedWriter類型的引用
PipedWriter經過鏈接 與 PipedReader相連,也就是得到PipedWriter對象

而後PipedWriter的write也是經過PipedReader 操做緩衝區
PipedReader 也是操做他本身內部的緩衝區
這就實現了 數據的直連

本文說的並無PipeInputStream和PipedOutputStream中介紹的詳細
若是不明白,建議看看以前的PipeInputStream和PipedOutputStream 的介紹
只要完全理解了管道的原理,經過構造方法成功構造出來管道以後
就能夠忘掉這些,權當作他們僅僅就是Writer 和 Reader
相關文章
相關標籤/搜索