Java IO(八) PipedInputStream 和 PipedOutputStream
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的更多相关文章
- Java之IO(八)PipedIutputStream和PipedOutputStream
转载请注明源出处:http://www.cnblogs.com/lighten/p/7056278.html 1.前言 本章介绍Java的IO体系中最后一对字节流--管道流.之前在字节数组流的时候就说 ...
- 系统学习 Java IO (八)----装饰流 FilterInputStream/FilterOutputStream
目录:系统学习 Java IO---- 目录,概览 这两个流的作用是:"封装其它的输入流,并为它们提供额外的功能" 他们的直接子类有: BufferedInputStream 的作 ...
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...
- Java IO 技术之基本流类
流式IO 流(Stream)是字节的源或目的. 两种基本的流是:输入流(Input Stream)和输出流(Output Stream).可从中读出一系列字节的对象称为输入流.而能向其 ...
- PipedInputStream和PipedOutputStream详解
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进 ...
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...
- java IO 管道流PipedOutputStream/PipedInputStream
详情:管道流的具体实现 import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputS ...
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
- Java IO源码分析(三)——PipedOutputStream和PipedInputStream
简介 PipedOutputStream和PipedInputStream主要用于线程之间的通信 .二者必须配合使用,也就是一段写入,另一端接收.本质上也是一个中间缓存区,讲数据缓存在PipedInp ...
随机推荐
- 如何使用badboy录制一个脚本并成功的导入jmeter中?
前言: 虽然,很多人已经不适用这种方式进行录制脚本了,因为不好维护.但是,还是有一些朋友在刚开始学习的过程中使用badboy. 可能有人会好奇了,人家五一都出去玩了,你在家学习吗?正巧前一阵有粉丝留言 ...
- 送你一份Redis书单,以后使用缓存的问题不用再问我啦!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书!
- C++中的隐式转换和explicit
隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...
- 机器学习的hello world——MNIST
MNIST:一个由60000行训练数据集和10000行的测试数据集(机器学习模型设计时必须有一个单独的数据集用于评估模型的性能)组成的数据集. 下载mnist的数据集后,将文件放入C:\Users\m ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- JAVA知识总结(二):封装
时隔近一年,我突然想起来这个文章还没有发完,所以就继续开始写.也不知道自己上次写到哪里了,不管了这里从面向对象的三个特性说起. 类和对象 在这之前,我们先了解什么是对象,已经什么是面向对象?对象:万物 ...
- STM32 基于 CubeMX配置GPIO点亮LED灯(超级详细+图文并茂)
我是一个只会点灯的菜鸟: 相关文章 [STM32系列汇总]小白博主的STM32实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 理论分析 2.1 LED 原理 2.2 板载资料 2.3 ...
- mongodb cluster
假设三台机器,ip分别为192.168.1.10,192.168.1.11,192.168.1.12,分别在每台电脑上下载并解压mongodb,关闭防火墙或者开放防火墙端口 一.安装shard 配置文 ...
- fastadmin后台:在表单操作项添加操作按钮并控制弹出页面的大小
1.进入对应目录:eg(public/assets/js/backend/conmpany.js) 2.在field:'operate' 中添加buttons 源码: {field: 'operate ...
- You should consider upgrading via the 'python -m pip install --upgrade pip' command.
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', ...