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. 《C程序设计语言》 练习1-21

    问题描述 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变.假设制表符终止位的位置与练习1 - 20的detab程序的情况相同.当使用一个制表符或者一个空格都可以到 ...

  2. 题解 AT3849 【[ABC084C] Special Trains】

    本文为UserUnknown原创 题目大意 总共有 \(N\) 个车站,每两个相邻的车站有单向的车. 从第 \(i\) 个站到第 \(i+1\) 个站 需要时间 \(C_i\) 分钟,且第一趟车在 \ ...

  3. muduo网络库源码学习————Timestamp.cc

    今天开始学习陈硕先生的muduo网络库,moduo网络库得到很多好评,陈硕先生自己也说核心代码不超过5000行,所以我觉得有必要拿过来好好学习下,学习的时候在源码上面添加一些自己的注释,方便日后理解, ...

  4. 复数(complex)

    表示复数信息 a = 12.3+4j print('a的类型为:', type(a)) # 运行结果:a的类型为: <class 'complex'> print(a.real) # 实部 ...

  5. 2020牛客寒假算法基础集训营1 J题可以回顾回顾

    2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...

  6. iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)

    学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...

  7. apply call bind的用法与实现

    概念 apply call 和bind 允许为不同的对象分配和调用属于一个对象的函数/方法.同时它们可以改变函数内 this 的指向. 区别 apply 和 call 接收的参数形式不同 apply ...

  8. java知识点查漏补缺-- 2020512

    jvm: jdbc statement: JDBC statement中的PReparedStatement的占位符对应着即将与之对应当值,并且一个占位符只能对应一个值,如果能对应多个就会引起混淆.s ...

  9. FPGA六位共阳极数码管动态显示

    `timescale 1ns/1ps module adc_dis( clk , rst_n , sm_seg , sm_bit ); input clk;//50HZ input rst_n; :] ...

  10. HttpRequestUtils post get请求

    package com.nextjoy.projects.usercenter.util.http; /** * Created by Administrator on 2016/10/20. */ ...