[十九]JavaIO之PipedReader 和 PipedWriter

 

功能简介

 

还记得PipedInputStream  和 PipedOutputStream么

我们之前是这么说的:

使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用

大致流程:

我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中;

线程B通过读取PipedInputStream中的数据

对照到我上面画的图就是这样:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值