Java IO类库之管道流PipeInputStream与PipeOutputStream
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相关推荐
- JAVA的IO编程:管道流
掌握线程通讯流(管道流)的使用 管道流的主要作用是可以进行两个线程间的通讯,分为管道输入流(PipeOutputStream)和管道输出流(PipeInputStream). 如果要想进行管道输出,则 ...
- java.IO字节流和字符流详解
IO流的分类 在学习字节流和字符流之前因该先学习IO流的分类,效果会更好 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Rea ...
- java io类库,Java利用io类库对各种文件的操作详解
Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...
- Java IO 字节流、字符流详解
1. 字节流与字符流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流 ...
- Java IO 字节流与字符流 (三)
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- java IO(输入输出) 字节缓冲流
//文件复制 package zhi_jie_liu;import java.io.*;public class Example04 {public static void main(String[] ...
- java io大文件_JavaIO流对大文件进行分割与合并
对于大文件传输不方便时候可以试一下分割之后再操作: package com.lym; import java.io.BufferedInputStream; import java.io.Buffer ...
- Java IO类库之CharArrayWriter
2019独角兽企业重金招聘Python工程师标准>>> 一.CharArrayWriter的介绍 CharWriter继承自java.io.Writer,内部实现了一个可用于保存写入 ...
- java 管道设计_使用管道流实现Java 8阶段构建器
Step builder多阶段步骤构造器模式是一种对象创建软件设计模式.与传统构建器模式进行比较时,步骤构建器模式提供了一些简洁的好处.Step Builder模式的主要优势之一是为客户提供有关如何使 ...
最新文章
- OpenStack OVS实现安全组(五)
- C++/CLI Winform中调用DLL的三种方法
- 【转】ASP.NET之 关于触发Global.asax Session_End事件的经验
- .NET Framework 4.5 五个很棒的特性
- mysql怎么查看代码_MySQL中的编码查看与设置(转载)
- 终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结
- Sublime Text 3无法安装Package Control插件的解决
- 2 安装失败_写bug日记2:PYTORCH GEOMETRIC安装失败的问题(未解决)
- WebService 工作原理及实例教程
- springboot,hibernate,exception no session 问题解决
- C++Lambda表达式作为参数
- Vb.net遍历一个窗口中的所有某类对象 (窗体中的控件) 的方法
- 软件 PRE、RC、beta、RTM、CTP等版本号的基本区别
- 生活记录:用Sai2给勾了线的图像上色
- MTK Android 之MT6577驱动笔记
- 用java做考试管理系统,考试管理系统的开发实现(Java+Web)
- usb一致性测试软件,USB 3.0一致性测试方法
- win10和linux怎么切换输入法,win10系统怎么切换输入法
- linux 文件夹的作用是什么,Linux个文件夹的作用及含义
- 【经验】短接 Flash 解决二次量产金士顿 DTI G2 4GB U盘(群联PS2251-39)问题