管道流

源文章: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();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值