[七]JavaIO之 PipedInputStream 和 PipedInputStream

 

管道简介

 

管道的含义,好久以前就已经出现java

用于表示数据直接交互数组

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

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

 

 

 

 

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

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

大体流程:操作系统

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

线程B经过读取PipedInputStream中的数据ip

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

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

在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要求的是同样的,没什么特别的

实现细节有兴趣的能够深刻研究

相关文章
相关标签/搜索