JavaIO之PipedReader 和 PipedWriter(二十)
### 功能简介还记得PipedInputStream和 PipedOutputStream么
我们之前是这么说的:
使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用
大致流程:
我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中;
线程B通过读取PipedInputStream中的数据
对照到我上面画的图就是这样:
!(data/attachment/forum/202208/26/125533oar1bbtrmo33d7rt.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
我们现在看下PipedReader和 PipedWriter的关键的成员变量
你应该可以想得到
他们的实现逻辑跟PipedInputStream和PipeOutputStream是类似的
!(data/attachment/forum/202208/26/125551lt3pyh4iryhb6hpy.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
!(data/attachment/forum/202208/26/125604iana0niq44td42tf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
#### PipedReader PipedWriter 基本原理和工作流程
PipedWriter中有一个 PipedReader sink成员变量
PipedReader 中有一个缓冲区char buffer[] 可以用于保存数据
他们本质上操作的都是这个缓冲区
PipedReader操作的自己的缓冲区
PipedWriter 操作的是PipedReader 的缓冲区
PipedWriter 需要和PipedReader进行连接,或者在构造的时候直接连接
连接之后,就形成了一个管道 (其实就是PipedWriter内部可以调用PipedReader 的方法)
PipedWriter 写入的数据,可以通过PipedReader进行读取
### 构造方法
PipedReader 在构造的时候可以指定缓冲区大小,不指定则使用默认值
也可以在构造的时候就连接到一个PipedWriter 或者后续再连接
所以构造方法有四种形式
指定缓冲区大小, 不连接
默认缓冲区大小, 不连接
指定缓冲区大小, 连接
默认缓冲区大小, 连接
!(data/attachment/forum/202208/26/125641uww4unbn33zbz33s.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
对于PipedWriter 有两种形式
单纯的创建一个PIpedWriter
或者创建的同时一并连接到一个PipedReader
!(data/attachment/forum/202208/26/125650n2v59c5b9zl95lxo.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 其他方法
#### connect
connect方法,根本形式只有一种
不管是PipedWriter连接PipedReader 还是 PipedReader连接 PipedReader
!(data/attachment/forum/202208/26/125715d97z1x7pi6mxorbb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
首先真正的将PipedReader和PipedWriter进行连接,也就是设置sink
然后就是设置in和out 他们是写入PipedReader中的缓冲区和从缓冲区读取的索引号
然后就是标志已经连接成功了
除了上面介绍的方法以外,就是常规的Reader 和 Writer方法了,他们的语义不变
PipedWriter 提供了两个版本的write方法
写入一个字符
或者写入一些字符 从cbuf[] off偏移量开始的len个字符
```java
public void write(int c)throws IOException
public void write(char cbuf[], int off, int len) throws IOException
```
!(data/attachment/forum/202208/26/125800fukyhqquryukyj4l.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
PipedReader也是有一个receive方法,用来写入缓冲区
本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/
PipedReader 提供了两个版本的read方法
读取一个字符
或者读取指定个数的字符数目 保存到指定的数组,到她的指定的位置
```java
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
!(data/attachment/forum/202208/26/125910ft5zpwnltwz9n9p0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
PipedReader 也提供了常规的close方法
PipedWriter 也提供了常规的close和 flush方法
### 总结
对于PipedReader和PipedWriter 要理解根本原理
PipedReader内部维护了一个缓冲区 PipedWriter 内部包含了一个PipedWriter类型的引用
PipedWriter通过连接 与 PipedReader相连,也就是获得PipedWriter对象
然后PipedWriter的write也是通过PipedReader 操作缓冲区
PipedReader 也是操作他自己内部的缓冲区
这就实现了 数据的直连
本文说的并没有PipeInputStream和PipedOutputStream中介绍的详细
如果不明白,建议看看之前的PipeInputStream和PipedOutputStream 的介绍
只要彻底理解了管道的原理,通过构造方法成功构造出来管道之后
就可以忘掉这些,权当做他们仅仅就是Writer 和 Reader
!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-156-1-1.html `
页:
[1]