源文章:http://www.programbbs.com/doc/459.htm 感谢原作者.
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据.
PipedInputStream与PipedOutputStream类的编程实例(两个线程间进行通信的实例程序)
//Sender.java 发送者,这个线程主要用于向另一个线程发送数据
import java.io.*;
public class Sender extends Thread{ //表明是个线程类
private PipedOutputStream out = new PipedOutputStream(); //发送者是要向外面写数据,所以发送者内部创建PipedOutputStream对象用于向外写数据
public PipedOutputStream getOutputStream(){ //返回管道输出流对象
return out;
}
//这是一个线程类,所以它应该覆盖Thread的run方法,run方法在线程类启动时自动运行
public void run(){ //这里的run方法用于向PipedOutputStream中写入一串数据
String strInfo = new String("hello,receiver!");
try{ //write和close方法都可能有异常出现
out.write(StrInfo.getBytes());
out.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
//Receiver.java //接收者,也是一个线程类
import java.io.*;
public class Receiver extends Thread{
private PipedInputStream in = new PipedInputStream(); //接受者是要读取外面的数据,所以接受者内部创建PipedInputStream对象用于读取外面的数据
public PipedInputStream getInputStream(){ //返回管道输入流对象
return in;
}
//这是一个线程类,所以它应该覆盖Thread的run方法,run方法在线程类启动时自动运行
public void run(){ //这里的run方法用于接收数据
byte[] buf = new byte[1024]; //字节数组
try{ //read和close方法都可能有异常出现
int len = in.read(buf); //读取数据,len表示实际读取到的内容(长度)
System.out.println("the following message comes from sender:\n" = new String(buf ,o,len) );
in.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
//PipedStreamTest.java //启动类
import java.io.*;
public calss PipedStreamTest{
public static void main(String[] args) throws Exception {
Sender t1 = new Sender(); //创建发送者对象;
Receiver t2 = new Receiver(); //创建接收者对象;
PipedOutputStream out = t1.getOutputStream();
PipedInputStream in = t2.getIntStream();
out.connect(in); //用于连接到PipedInputStream上,与in.connect(out)等价,connect方法有异常出现的可能
t1.start(); //启动线程
t2.start(); //启动线程
}
}
PipedWriter和PipedReader类,它用来处理字符文本的管道通信.
使用管道流类,可以实现名个程序模块之间的松耦合通信,这样我们在程序中就可以灵活的将多个这样的模块的输入流与输出流相联,然后以拼装成满足各种应用的程序,而不用对模块内部进行修改.使用管道连接的模块具有强内聚弱耦合的特点,若模块被替换或被拆卸不会影响到其他的模块.
代码整理:
public class PipeStreamTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
Thread t1=new Sender();
Thread t2=new Receiver();
PipedOutputStream out=((Sender) t1).getOutputStream();
PipedInputStream in = ((Receiver) t2).getInputStream();
out.connect(in);
t1.start();
t2.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Receiver extends Thread{
private PipedInputStream in=new PipedInputStream();
public PipedInputStream getInputStream() {
return in;
}
@Override
public void run() {
String s=null;
byte[] buf=new byte[1024];
try {
int len=in.read(buf);
s=new String(buf,0,len);
System.out.println("The following message comes from sender:\n"+s);
in.close();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
public class Sender extends Thread{
private PipedOutputStream out=new PipedOutputStream();
public PipedOutputStream getOutputStream() {
return out;
}
@Override
public void run() {
String s=new String("Hello,receiver,how are you");
try {
out.write(s.getBytes());
out.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
分享到:
相关推荐
**qml简易管道流动效果** QML(Qt Meta Language)是Qt框架的一部分,它提供了一种声明式编程方式,用于创建富图形用户界面。在本文中,我们将深入探讨如何使用QML实现一个简易的管道流动效果,这个效果适用于工业...
在本案例中,我们关注的是"WINCC管道流动控件",这是一类专门用于模拟和显示流体流动效果的可视化组件。 WINCC中的管道流动控件是设计用来在HMI界面上动态呈现液体、气体等流体流动状态的工具。这些控件能够帮助...
"WinCC管道流动控件"是指在WinCC项目中使用的特殊控件,它允许用户以图形化的方式展示流程工业中的液体、气体或其他流体介质的流动状态。这种控件在化工、石油、制药等行业的过程控制中尤其常见,能够帮助操作员直观...
针对java中的管道流的应用的解析,包括PipedInputStream和PipedOutputStream。
Java管道流(PipedInputStream和PipedOutputStream)是Java I/O流的一部分,主要用于在不同的线程之间传递数据。它们提供了一种机制,使得一个线程可以写入数据,而另一个线程可以从管道读取这些数据,实现数据的...
unity 管道流动着色器
### Java管道流详解 在Java编程中,管道流(Piped Stream)是一种特殊的流类型,主要用于线程间的通信。管道流主要包括两个类:`PipedInputStream`和`PipedOutputStream`。通过这两个类,可以实现数据从一个线程到...
标题"MOC_1300m_30dgree_16dgree_82dgree_管道流MATLAB_管道计算_matlab_"表明这是一个关于使用MATLAB进行管道流瞬变计算的项目。描述中提到,该程序考虑了粘度变化的影响,这在流体动力学中是非常重要的因素。接...
标题提到的"wincc 管道流动 不会用的可以问我"表明我们将讨论如何在WinCC 7.0中创建和应用管道流动效果的可视化控件。 WinCC 7.0是该系列软件的一个版本,具有更强的性能和更丰富的功能,如优化的系统资源管理,...
在IT领域,尤其是在流体力学计算和工程应用中,经常涉及到管道流动的模拟与分析。本文将详细讨论“F.rar_matlab 管道_充填_流动_流动方程_管道流动”这一主题,主要关注如何使用MATLAB来解决这类问题。 MATLAB是一...
标题"MOC_1300m_20dgree_70dgree_管道流MATLAB_管道计算_matlab_"表明这是一个使用MATLAB编程环境进行的管道流动模拟项目,其中"1300m"可能代表管道的长度,"20dgree"和"70dgree"可能是温度条件,可能涉及不同温度下...
COMSOL非等温一维管道流模拟:集成物质传递、化学反应与温度变化的甲烷燃烧分析,comsol一维管道流模型,集非等温管道流模块、浓物质传递模块和化学反应模块为一体,三物理场耦合,本模拟以甲烷气体为例进行模拟仿真...
在"最终源代码.txt"文件中,可能包含了用MATLAB编写的程序代码,用于实现特征线法求解管道中的可压缩流瞬变流动问题。这类代码通常包括以下几个部分: - **初始化**:设定物理参数(如流体属性、管道尺寸、初始条件...
Java中的管道流是一种用于线程间通信的机制,它的核心思想是将一个线程的输出作为另一个线程的输入,从而实现数据的传递。在Java I/O系统中,管道流分为字节流和字符流两种类型,我们主要讨论的是字节流。 1. 管道...
标题中的“TFPF_管道_管道流_TFPF_温度场_数据_”暗示了我们正在探讨的主题涉及热流体动力学(Thermal Fluids Physics Fundamentals,简称TFPF),特别是关于管道内的流体流动以及如何计算和分析在这种流动条件下...
在这个特定的案例中,我们关注的是一个二维低速层流管道流动,也就是泊肃叶流动。泊肃叶流动是指在没有重力作用下,流体在圆形或矩形管道内受粘性力驱动的稳定流动,通常用于教学和理解流体的基本特性。 这个案例...
Java管道流是Java标准库提供的一种机制,允许数据在不同线程之间进行高效的数据传输。在Java开发中,尤其是在处理控制台输出时,管道流能帮助我们捕获和处理System.out和System.err的输出,这对于调试、日志记录或者...
COMSOL一维管道流模型:集成非等温流、浓物质传递与化学反应模块,模拟甲烷燃烧多维物理场耦合反应,真实反映粒子空间变化,COMSOL一体化管道流模拟:甲烷燃烧一维模型详解,包含GRI-3.0核心反应及多物理场耦合分析,...
Java管道流是Java I/O系统中的一个重要特性,它允许线程之间进行直接的数据通信,而无需借助共享数据空间。在Unix/Linux操作系统中,管道是一种基本的进程间通信机制,Java中的管道流则提供了类似的功能,使得一个...
- Java中的管道流是一种特殊类型的流,它允许数据从一个线程传输到另一个线程。它由`PipedInputStream`和`PipedOutputStream`组成。其中`PipedOutputStream`用于写入数据,而`PipedInputStream`则用于读取这些数据...