管道简介

管道的含义,很久之前就已经出现

用于表示数据直接交互

它的含义与平时说的管道的含义是类似的,就是直连

JavaIO中的 PipedInputStream 和 PipedOutputStream 就是IO体系中字节流的管道

java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流

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

大致流程:

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

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

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

虽然说是管道,跟现实中的含义有些类似,但是也绝对不能认为他们的数据流方向可以任意

在JavaIO中必须是一个线程通过PipedOutputStream 写入数据,另外的线程通过与他相连接的PipedInputStream读取数据

实现原理

PipedOutputStream 中有一个 pipedInputStream

pipedInputStream 内部有一个字节数组 通过initPipe方法进行初始化

调用PipedOutputStream的write方法,实际上调用的是内部pipedInputStream 的 receive方法

而 receive方法,操作的正是pipedInputStream内部的字节数组

所以说,只需要使用connect把管道连接起来

就可以通过PipedOutputStream 写入数据,PipedOutputStream读取数据

数据的中转站,正是pipedInputStream 内的数组

PipedInputStream

刚才已经介绍,PipedInputStream 内部维护了一个字节数组 buffer 默认大小为1024

通过initPipe方法初始化

PipedOutputStream 和 PipedInputStream 他们其实操作的都是

PipedInputStream 中的buffer

一个读一个写,所以要记住读和写的位置

注意

此处的in和 out 是相对于 PipedInputStream 的buffer[] 来说的

所以in就是 PipedOutputStream 调用write最终使用的

out就是 PipedInputStream 本身read使用的

想要使用管道流必须要有连接的过程

可以在创建 PipedInputStream 的同时一并连接

或者仅仅创建PipedInputStream 稍后连接

而且,内部字节数组的长度是可以设置的,所以也就是又有了默认的或者设置的两种形式

所以总共有四种形式的构造方法

read

public synchronized int read() throws IOException 读取一个字节

public synchronized int read(byte b[], int off, int len) 读取长度为len的字节到字节数组b 从偏移量off开始写入

available() 获取可用个数

close()

没有系统资源需要关闭,但是还是有些事情要做

connect

connect 调用的是PipedOutputStream中的connect方法

PipedOutputStream

内部需要PipedInputStream

构造方法也比较简单

创建一个PipeOutputStream或者创建的同时进行连接

刚才讲过,PipedInputStream中的connect也是借助于PipedOutputStream

他完成了真正的连接

看得出来,不能重复连接,否则会抛出异常

连接后,会对连接进来的PipedInputStream进行必要的初始化 主要就是 in和 out

另外标记已经连接,也正是用这个connected字段来校验是否已经连接的

write

两个版本的write方法

write(int b) 写入一个字节, 前面24位会被丢弃

write(byte b[], int off, int len) 从指定字节数组的指定位置,读取指定个数的字节, 写入到流

根本还是调用的receive

flush

flush 将数据输出,此处不同于文件需要调用操作系统进行写入磁盘

需要通知读线程进行读取

close

对于管道流的学习,只需要了解其根本即可,那就是PipedOutputStream 内部指向了一个 PipedInputStream

借助于PipedInputStream 内部的循环数组进行数据缓存,进而达到多线程通信的目的

read 和 write方法的含义用法跟InputStream要求的是一样的,没什么特别的

实现细节有兴趣的可以深入研究

[七]JavaIO之 PipedInputStream 和 PipedInputStream的更多相关文章

  1. Java-IO之管道(PipedInputStream和PipedOutputStream)

    java中PipedInputStream和PipedOutputStream分别是管道输入流和管道输出流,它的作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将PipedInput ...

  2. java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile

    http://blog.csdn.net/zlp1992/article/details/50298195   给个链接自己去看吧.网上资料不是很多,而且自己也不想写了 RandomAccessFil ...

  3. PipedInputStream和PipedOutputStream详解

    PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进 ...

  4. Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter

    java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...

  5. Java中的管道流 PipedOutputStream和PipedInputStream

    我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...

  6. Java IO(八) PipedInputStream 和 PipedOutputStream

    Java IO(八) PipedInputStream 和 PipedOutputStream 一.介绍 PipedInputStream 和 PipedOutputStream 是管道输入流和管道输 ...

  7. java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader

    1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...

  8. javaIO整理

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...

  9. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

随机推荐

  1. Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

    1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一 ...

  2. 检查对象是否为NULL或者为Empty

    不管是在Winform开发,还是在asp.net 开发中当从一个数据源中获取数据时你总是不知道这个数据的状态,这个时候总要对她进行一次判断,不过每次进行一次判断总是要写怎么一堆代码,时间长了,总感觉不 ...

  3. 马昕璐 201771010118《面向对象程序设计(java)》第十五周学习总结

    第一部分:理论知识学习部分 JAR文件:将.class文件压缩打包为.jar文件后,使用ZIP压缩格式,GUI界面程序就可以直接双击图标运行. 既可以包含类文件,也可以包含诸如图像和声音这些其它类型的 ...

  4. hbase数据原理及基本架构

    第一:hbase介绍 hbase是一个构建在hdfs上的分布式列存储系统: hbase是apache hadoop生态系统中的重要一员,主要用于海量结构化数据存储 从逻辑上讲,hbase将数据按照表. ...

  5. python错误和异常

    一:语法错误syntax errors        熟悉语法! 二:异常 ①打印错误信息时,异常的类型作为异常的内置名显示,并以调用栈的形式显示具体信息    ②常见的异常:             ...

  6. linux 使用sh@d0ws0cks server

    [root@linux-node1 ~]# cat /etc/shadowsocks.json { "server":"x.x.x.x", , "lo ...

  7. python 模型 ORM简介

    Django之ORM (Object Relational Mapping(ORM)一.ORM介绍1.ORM概念 对象关系映射模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.2.OR ...

  8. js封装一个模块

    (function(){ var defaultSetting = { color:'red' } Setting (options) { var self = this; self = Object ...

  9. MySQL 的分页查询 SQL 语句

    MySQL一般使用 LIMIT 实现分页.基本语句为: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 在中小数据量的情况下,这样的SQL足够 ...

  10. [Swift]LeetCode150. 逆波兰表达式求值 | Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...