功能简介


还记得PipedInputStream  和 PipedOutputStream么
我们之前是这么说的:

p, li { white-space: pre-wrap; }

使用管道通信时,必须将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 IOException
public void write(char cbuf[], int off, int len) throws IOException 
看得出来,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 


PipedReader 也提供了常规的close方法

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


总结


对于PipedReader和PipedWriter 要理解根本原理
PipedReader内部维护了一个缓冲区 PipedWriter 内部包含了一个PipedWriter类型的引用
PipedWriter通过连接 与 PipedReader相连,也就是获得PipedWriter对象

然后PipedWriter的write也是通过PipedReader 操作缓冲区
PipedReader 也是操作他自己内部的缓冲区
这就实现了 数据的直连

本文说的并没有PipeInputStream和PipedOutputStream中介绍的详细
如果不明白,建议看看之前的PipeInputStream和PipedOutputStream 的介绍
只要彻底理解了管道的原理,通过构造方法成功构造出来管道之后
就可以忘掉这些,权当做他们仅仅就是Writer 和 Reader


[十九]JavaIO之PipedReader 和 PipedWriter的更多相关文章

  1. Java-IO之PipedReader和PipedWriter

    PipedReader和PipedWriter与PipedInputStream和PipedOutputStream一样,都可以用于管道通信.PipedWriter是字符管道输出流,继承于Writer ...

  2. javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天

    上一篇学习了javaIO里面的 PipedReader 和 PipedWriter,这里对两个类做一个小小的练习:实现一个即时消息发送和接收的聊天系统(这里只实现单向发送,双向同理,定义两个管道即可) ...

  3. 无废话ExtJs 入门教程十九[API的使用]

    无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...

  4. Python之路【第十九章】:Django进阶

    Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...

  5. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  6. Bootstrap <基础十九>分页

    Bootstrap 支持的分页特性.分页(Pagination),是一种无序列表,Bootstrap 像处理其他界面元素一样处理分页. 分页(Pagination) 下表列出了 Bootstrap 提 ...

  7. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  8. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】

    <Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  9. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

随机推荐

  1. RCNN论文细节

    写在前面: 本系列笔记主要记录本人在阅读过程中的收获,尽量详细到实现层次,水平有限,欢迎留言指出问题~ 这篇文章被认为是深度学习应用于目标检测的开山之作,自然是要好好读一下的,由于文章是前些日子读的, ...

  2. 面试题5-[剑指offer] 二维数组中的查找

    题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  3. vue 登录跳转

    前几次做登录处理,都是写一个公用方法,然后在对应的路由页面调用,即判断是不是处于登录状态,如果不是,就返回登录页面. let exit = (vm)=>{ let login = session ...

  4. C# CreateParams的使用(解决闪屏问题)

    <转载自:https://blog.csdn.net/xpwang/article/details/53427479> 窗体和控件的属性CreateParams(这真的是一个属性)很神奇, ...

  5. 微信小程序开发-窗体设置

    "window": { "backgroundTextStyle": "light", "navigationBarBackgro ...

  6. FCC(ES6写法) Symmetric Difference

    创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组. 给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2 ...

  7. 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(1)

    还是先上图吧,无图无真相 别以为真懂Openstack!先别着急骂我,我也没有说我真懂Openstack 我其实很想弄懂Openstack,然而从哪里下手呢?作为程序员,第一个想法当然是代码,Code ...

  8. 【kafka学习之五】kafka运维:kafka操作日志设置和主题删除

    一.操作日志 首先附上kafka 操作日志配置文件:log4j.properties 根据相应的需要设置日志. #日志级别覆盖规则 优先级:ALL < DEBUG < INFO <W ...

  9. React Native 0.50版本新功能简介

    React Native在2017年经历了众多版本的迭代,从接触的0.29版本开始,到前不久发布的0.52版本,React Native作为目前最受欢迎的移动跨平台方案.虽然,目前存在着很多的功能和性 ...

  10. [Swift]LeetCode232. 用栈实现队列 | Implement Queue using Stacks

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...