zoukankan      html  css  js  c++  java
  • [十九]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

  • 相关阅读:
    smary里Js正则表达式不正常
    php7下对微信支付退款申请通知的解密处理
    apache下设置deflate/gzip
    从大表里随机取若干行的效率问题
    Ecshop、Discuz! 等开源产品的局限
    mysql实现ORACLE的connect by prior父子递归查询
    SQL计算字符串里的子字符串出现个数
    UCENTER同步登录工作原理和配置要点
    云服务器:西部数码VS阿里云
    用ftp命令实现主机文件批量更新
  • 原文地址:https://www.cnblogs.com/noteless/p/9640714.html
Copyright © 2011-2022 走看看