Java IO(八) PipedInputStream 和 PipedOutputStream

一、介绍

PipedInputStream 和 PipedOutputStream 是管道输入流和管道输出流。它们的作用就是让多线程通过管道进行线程间的通讯。在使用管道通讯时,必须 PipedInputStream 和 PipedOutputStream 配套使用。

使用管道通信时,大致的流程是:我们在线程A中向 PipedOutputStream 中写入数据,这些数据会自动的发送到与 PipedOutputStream 对应的 PipedInputStream 中,进而存储在 PipedInputStream 的缓冲中;此时,线程B通过读取 PipedInputStream 中的数据,这样就可以实现,线程A和线程B的通信。

不建议单个线程使用这两个对象,因为它可能会使线程死锁。

二、构造方法

(一)、PipedInputStream

(二)、PipedOutputStream

三、常用API

(一)、PipedInputStream

(二)、PipedOutputStream

四、实例

多线程通过 PipedInputStream 和 PipedOutputStream 进行线程间同通讯,下面例子分别定义三个类:PipedDemo(主线程main类),PipedSender(发送者对象)、PipedReceiver(接收者对象)。实例中只贴出主要代码。

注意点:

管道输入流 PipedInputStream 与管道输出流 PipedOutputStream 建立连接

建立连接一般使用 connect() 方法连接或在创建输入流对象时,传递连接该管道的输出流对象。

connect() ,如:out.connect(in) 和 in.connect(out) 是等价的,开发时只能选择其中的一个而不能两个 connect 同时调用,否则会抛出 java.io.IOException: Already connected 异常。

创建流对象,如:PipedOutputStream out = new PipedOutputStream(in),in 为 PipedInputStream 对象,必须先实例化使用,否则会报 java.lang.NullPointerException 异常。PipedOutputStream out = new PipedOutputStream(in) 与 PipedInputStream in = new PipedInputStream(out) 是等价的,开发时传递的流对象作为参数必须实例化,然后进行传递。

(一)、PipedSender(发送者对象)

public class PipedSender extends Thread{
// 定义私有PipedOutputStream 对象
private PipedOutputStream out = new PipedOutputStream(); public PipedOutputStream getOutputStream() {
return out;
}
// 线程执行的方法
@Override
public void run() {
     //writeOne();
writeMove();
} /**
* 写入一段短数据
*/
private void writeOne() {
byte[] buffer = "this is a message".getBytes();
try {
out.write(buffer);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (out != null) {
out.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
} /**
* 写入较长数据
*/
public void writeMove() {
StringBuffer sb = new StringBuffer();
for(int i = 0;i < 100;i++) {
sb.append("12345678790");
}
sb.append("abcdefghijklmnopqrstvuwxyz");
String str = sb.toString();
try {
out.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (out != null) {
out.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}

(二)、PipedReceiver(接收者对象)

public class PipedReceiver extends Thread{
// 私有PipedInputStream 对象
private PipedInputStream in = new PipedInputStream();
public PipedInputStream getInputStream() {
return in; }
@Override
public void run() {
//readOne();
readMove();
} /**
* 读取一次
*/
public void readOne() {
byte[] buffer = new byte[2048];
int len = 0;
try {
len = in.read(buffer);
System.out.println(new String(buffer,0,len));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
}catch(Exception e) {
e.printStackTrace();
}
} } /**
* 读取多次
*/
private void readMove() {
byte[] buffer = new byte[1024];
int len = 0;
try {
while(true) {
len = in.read(buffer);
// 一值读取,直到结束
if(len == -1)
break;
System.out.println(new String(buffer,0,len));
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (in != null) {
in.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}

(三)、PipedDemo(main方法类)

public class PipedDemo {

    public static void main(String[] args) {
PipedSender sender = new PipedSender();
PipedReceiver receiver = new PipedReceiver(); PipedOutputStream out = sender.getOutputStream();
PipedInputStream in = receiver.getInputStream();
try {
// 下面两条语句是一样的,但只能允许存在一条语句
//in.connect(out);
out.connect(in);
       // 分别开启两个线程
sender.start();
receiver.start();
} catch (IOException e) {
e.printStackTrace();
} }
}

Java IO(八) PipedInputStream 和 PipedOutputStream的更多相关文章

  1. Java之IO(八)PipedIutputStream和PipedOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7056278.html 1.前言 本章介绍Java的IO体系中最后一对字节流--管道流.之前在字节数组流的时候就说 ...

  2. 系统学习 Java IO (八)----装饰流 FilterInputStream/FilterOutputStream

    目录:系统学习 Java IO---- 目录,概览 这两个流的作用是:"封装其它的输入流,并为它们提供额外的功能" 他们的直接子类有: BufferedInputStream 的作 ...

  3. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  4. Java IO 技术之基本流类

    流式IO 流(Stream)是字节的源或目的.         两种基本的流是:输入流(Input Stream)和输出流(Output Stream).可从中读出一系列字节的对象称为输入流.而能向其 ...

  5. PipedInputStream和PipedOutputStream详解

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

  6. java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

    本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...

  7. java IO 管道流PipedOutputStream/PipedInputStream

    详情:管道流的具体实现 import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputS ...

  8. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  9. Java IO源码分析(三)——PipedOutputStream和PipedInputStream

    简介 PipedOutputStream和PipedInputStream主要用于线程之间的通信 .二者必须配合使用,也就是一段写入,另一端接收.本质上也是一个中间缓存区,讲数据缓存在PipedInp ...

随机推荐

  1. RF(常用关键字)

    一.常用关键字 Open Browser    [url | browser | alias]    打开浏览器 Close Browser     关闭当前浏览器(不是窗口) Close All B ...

  2. centos下配置LNMP环境(源码安装)

    准备工作,安装依赖库 yum -y install gcc automake autoconf libtool make gcc-c++ glibc libxslt-devel libjpeg lib ...

  3. python学习之列表的定义以及增删改查

    列表定义: >>> name['lily','lucy','tom'] >>> nums = [11,22,33,'100','lily'] #python中的列表 ...

  4. Code::Blocks20.03 编译报错

    Code::Blocks最近出了新版20.03,进入官网选择下载了附带MinGW版的安装包后,编译HelloWorld就报错(CB一直以来都有问题,新版还是这样...) 主要有两个问题: ld.exe ...

  5. CTR预估模型演变及学习笔记

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]如果你对智能推荐感兴趣,欢迎先浏览我的另一篇随笔:智能推荐算法演 ...

  6. 使用elasticsearch搭建自己的搜索系统

    什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能. 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁 ...

  7. 【matlab 基础篇 03】一文带你全面了解 plot 绘图函数的使用(超详细+图文并茂)

    快速入门matlab,系统地整理一遍,如何你和我一样是一个新手,那么此文很适合你: 文章目录 1 前言 2 plot 2.1 显示正弦波 2.2 修改颜色 2.3 修改点的形状 2.4 修改线的形状 ...

  8. 值得收藏的js原型详解

    从虚无到Object 起初,地是空虚混沌,渊面黑暗:这时候一切还是null 神说,要有原型,于是就有了prototype 原型从凭空产生,于是需要一个指向于null的特征,人们把这种特征叫做隐式原型, ...

  9. 如何将Altera官方提供的CADENCE.OLB应用于altium Designer中

  10. JQ选择器-选择符合条件的元素,获取对应关系元素

    如果你想寻找id以“sub_”开头的元素,你可以使用: $("*[id^='sub_']") 如果你想寻找id以“trim”结尾的元素,你可以使用: $("*[id$=' ...