[七]JavaIO之 PipedInputStream 和 PipedInputStream
管道简介
|
管道的含义,很久之前就已经出现 用于表示数据直接交互 |
它的含义与平时说的管道的含义是类似的,就是直连 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的更多相关文章
- Java-IO之管道(PipedInputStream和PipedOutputStream)
java中PipedInputStream和PipedOutputStream分别是管道输入流和管道输出流,它的作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将PipedInput ...
- java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile
http://blog.csdn.net/zlp1992/article/details/50298195 给个链接自己去看吧.网上资料不是很多,而且自己也不想写了 RandomAccessFil ...
- PipedInputStream和PipedOutputStream详解
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进 ...
- Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- Java中的管道流 PipedOutputStream和PipedInputStream
我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...
- Java IO(八) PipedInputStream 和 PipedOutputStream
Java IO(八) PipedInputStream 和 PipedOutputStream 一.介绍 PipedInputStream 和 PipedOutputStream 是管道输入流和管道输 ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
- javaIO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- MYSQL必知必会学习笔记
8.1.1 百分号( %)通配符最常使用的通配符是百分号( %).在搜索串中, %表示任何字符出现任意次数.例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:SELECT prod_ ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- vue 源码学习(一) 目录结构和构建过程简介
Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...
- microk8s
https://microk8s.io/ video guide: sudo snap install microk8s --classic #snap install microk8s --clas ...
- python基础之函数式编程
一.定义: 函数作为参数作用:将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则: 函数作为返回值作用:逻辑连续,当内部函数被调用时,不脱离当前的逻辑. 二.高阶函数: 1.定义:将 ...
- js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法:
js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法: var s = new MyString('hello'); s.length; s[0]; // " ...
- Python连接MySQL数据库之pymysql模块使用
安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...
- RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ
摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...
- Oracle SQL性能优化的40条军规
1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...
- vue总结
1.库和框架的区别 库:jquery 本质上就是一些列函数的集合,将一些函数封装到一个独立的就是文件中 在使用的jquery的时候,是由开发人员说了算的,也就是说开发人员起到了主导作用,而jquery ...