2019独角兽企业重金招聘Python工程师标准>>>

一、java管道流介绍

在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的主要流程是在一个线程中向PipedOutputStream写入数据,这些数据会自动传送到对应的管道输入流PipedInputStream中,其他线程通过读取PipeInputStream中缓冲的数据实现多线程间通信。

二、PipedInputStream

 1 - PipedInputStream介绍

PipeInputStream是管道输入流,继承自InputStream,连接到一个管道输出流PipedOutputStream。可以缓存连接的管道输出流PipedOutputStream写入的字节数据。通常在一个线程使用PipedInputStream读取数据,在其他线程使用PipedOutputStream写入字节数据。不推荐在一个线程中使用PipedInputStream和PipedOutputStream可能会在线程中造成死锁,管道输入流包含一个缓冲区buff用于读操作和写操作。

2 - PipeInputStream源码分析

1)成员变量

package java.io;
public class PipedInputStream extends InputStream {//管道输出流是否关闭标记boolean closedByWriter = false;//管道输入流是否标记volatile boolean closedByReader = false;//管道输入流与管道输出流是否建立连接boolean connected = false;//读取“管道”数据即PipedInputStream线程Thread readSide;//向管道写入数据即PipedOutputStream线程Thread writeSide;//管道默认大小private static final int DEFAULT_PIPE_SIZE = 1024;protected static final int PIPE_SIZE = DEFAULT_PIPE_SIZE;// 缓冲区   protected byte buffer[];//下一个写入字节的位置protected int in = -1;//下一个读取字节的位置。若out==in说明管道输出流写入的数据全部被读取protected int out = 0;
}

2)构造方法

    public PipedInputStream(PipedOutputStream src) throws IOException {this(src, DEFAULT_PIPE_SIZE);}public PipedInputStream(PipedOutputStream src, int pipeSize)throws IOException {initPipe(pipeSize);connect(src);}public PipedInputStream() {initPipe(DEFAULT_PIPE_SIZE);}

从源码我们可以知道管道输入流PipedInputStream构造方法做了两件事,按照指定大小pipeSize初始化缓冲区,如果还指定了关联的管道输出流PipedOutputStream,那么调用connect方法连接它。如果指定的pipeSize小于等于0那么抛出IllegalArgumentException异常,如果当前的管道输入流已经和指定的管道输出流建立连接那么抛出IOException异常提示连接已经建立。

3)其他成员方法

    //根据指定大小pipeSize初始化缓冲

Java IO类库之管道流PipeInputStream与PipeOutputStream相关推荐

  1. JAVA的IO编程:管道流

    掌握线程通讯流(管道流)的使用 管道流的主要作用是可以进行两个线程间的通讯,分为管道输入流(PipeOutputStream)和管道输出流(PipeInputStream). 如果要想进行管道输出,则 ...

  2. java.IO字节流和字符流详解

    IO流的分类 在学习字节流和字符流之前因该先学习IO流的分类,效果会更好 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Rea ...

  3. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  4. Java IO 字节流、字符流详解

    1. 字节流与字符流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流 ...

  5. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  6. java IO(输入输出) 字节缓冲流

    //文件复制 package zhi_jie_liu;import java.io.*;public class Example04 {public static void main(String[] ...

  7. java io大文件_JavaIO流对大文件进行分割与合并

    对于大文件传输不方便时候可以试一下分割之后再操作: package com.lym; import java.io.BufferedInputStream; import java.io.Buffer ...

  8. Java IO类库之CharArrayWriter

    2019独角兽企业重金招聘Python工程师标准>>> 一.CharArrayWriter的介绍 CharWriter继承自java.io.Writer,内部实现了一个可用于保存写入 ...

  9. java 管道设计_使用管道流实现Java 8阶段构建器

    Step builder多阶段步骤构造器模式是一种对象创建软件设计模式.与传统构建器模式进行比较时,步骤构建器模式提供了一些简洁的好处.Step Builder模式的主要优势之一是为客户提供有关如何使 ...

最新文章

  1. OpenStack OVS实现安全组(五)
  2. C++/CLI Winform中调用DLL的三种方法
  3. 【转】ASP.NET之 关于触发Global.asax Session_End事件的经验
  4. .NET Framework 4.5 五个很棒的特性
  5. mysql怎么查看代码_MySQL中的编码查看与设置(转载)
  6. 终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结
  7. Sublime Text 3无法安装Package Control插件的解决
  8. 2 安装失败_写bug日记2:PYTORCH GEOMETRIC安装失败的问题(未解决)
  9. WebService 工作原理及实例教程
  10. springboot,hibernate,exception no session 问题解决
  11. C++Lambda表达式作为参数
  12. Vb.net遍历一个窗口中的所有某类对象 (窗体中的控件) 的方法
  13. 软件 PRE、RC、beta、RTM、CTP等版本号的基本区别
  14. 生活记录:用Sai2给勾了线的图像上色
  15. MTK Android 之MT6577驱动笔记
  16. 用java做考试管理系统,考试管理系统的开发实现(Java+Web)
  17. usb一致性测试软件,USB 3.0一致性测试方法
  18. win10和linux怎么切换输入法,win10系统怎么切换输入法
  19. linux 文件夹的作用是什么,Linux个文件夹的作用及含义
  20. 【经验】短接 Flash 解决二次量产金士顿 DTI G2 4GB U盘(群联PS2251-39)问题

热门文章

  1. 中学计算机老师论文名称,初中信息技术高效课堂论文
  2. 编程学习 | c语言源程序扩展名
  3. 主要ZigBee芯片供应商ZigBee方案竞争能力比较
  4. 软件测试如何选择适合自己的工作?
  5. Linux clock driver
  6. 网络游戏P2P智能更新解决方案
  7. Linux驱动开发14 串口/485/232/GPS
  8. Kali ettercap-graphical工具使用图解
  9. wordpress网站使用wechat-social-login插件实现QQ、微信、钉钉、Github、手机号登陆
  10. [原创]PHP 异常错误处理