前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[十九]JavaIO之PipedReader 和 PipedWriter

[十九]JavaIO之PipedReader 和 PipedWriter

作者头像
noteless
发布2018-09-14 14:50:15
4500
发布2018-09-14 14:50:15
举报
文章被收录于专栏:noteless

功能简介

还记得PipedInputStream  和 PipedOutputStream么

我们之前是这么说的:

<font face="微软雅黑"> p, li { white-space: pre-wrap; } </font>

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

大致流程: 我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中; 线程B通过读取PipedInputStream中的数据

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

我们现在看下PipedReader  和    PipedWriter的关键的成员变量你应该可以想得到他们的实现逻辑跟PipedInputStream和PipeOutputStream是类似的

PipedReader   PipedWriter 基本原理和工作流程

PipedWriter中有一个 PipedReader sink成员变量 PipedReader 中有一个缓冲区char buffer[]   可以用于保存数据 他们本质上操作的都是这个缓冲区 PipedReader操作的自己的缓冲区 PipedWriter 操作的是PipedReader 的缓冲区 PipedWriter 需要和PipedReader进行连接,或者在构造的时候直接连接 连接之后,就形成了一个管道   (其实就是PipedWriter  内部可以调用PipedReader 的方法) PipedWriter 写入的数据,可以通过PipedReader  进行读取

构造方法

PipedReader 在构造的时候可以指定缓冲区大小,不指定则使用默认值

也可以在构造的时候就连接到一个PipedWriter 或者后续再连接

所以构造方法有四种形式

指定缓冲区大小, 不连接 默认缓冲区大小, 不连接 指定缓冲区大小, 连接 默认缓冲区大小, 连接

对于PipedWriter 有两种形式单纯的创建一个PIpedWriter或者创建的同时一并连接到一个PipedReader

其他方法

connect

connect方法,根本形式只有一种不管是PipedWriter连接PipedReader     还是 PipedReader  连接 PipedReader

首先真正的将PipedReader和PipedWriter进行连接,也就是设置sink然后就是设置in和out 他们是写入PipedReader中的缓冲区和从缓冲区读取的索引号然后就是标志已经连接成功了

除了上面介绍的方法以外,就是常规的Reader 和 Writer方法了,他们的语义不变

PipedWriter 提供了两个版本的write方法写入一个字符 或者写入一些字符 从cbuf[] off偏移量开始的len个字符public void write(int c)  throws IOExceptionpublic void write(char cbuf[], int off, int len) throws IOException

看得出来,PipedReader也是有一个receive方法,用来写入缓冲区

PipedReader 提供了两个版本的read方法读取一个字符或者读取指定个数的字符数目   保存到指定的数组,到她的指定的位置public synchronized int read()  throws IOExceptionpublic synchronized int read(char cbuf[], int off, int len)  throws IOException

PipedReader 提供了readyin是写入数据的下一个索引值,默认是-1如果小于0 显然没有任何数据已经被写入,也就是PipedReader中的缓冲区中并没有数据也就是没ready

PipedReader 也提供了常规的close方法

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

总结

对于PipedReader和PipedWriter 要理解根本原理

PipedReader内部维护了一个缓冲区 PipedWriter 内部包含了一个PipedWriter类型的引用

PipedWriter通过连接 与 PipedReader相连,也就是获得PipedWriter对象

然后PipedWriter的write也是通过PipedReader 操作缓冲区

PipedReader 也是操作他自己内部的缓冲区

这就实现了 数据的直连

本文说的并没有PipeInputStream和PipedOutputStream中介绍的详细

如果不明白,建议看看之前的PipeInputStream和PipedOutputStream 的介绍

只要彻底理解了管道的原理,通过构造方法成功构造出来管道之后

就可以忘掉这些,权当做他们仅仅就是Writer 和 Reader

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能简介
  • 构造方法
  • 其他方法
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档