Java提供管道功能,实现管道通信的类有两组:PipedInputStream和PipedOutputStream或者是PipedReader和PipedWriter。管道通信主要用于不同线程间的通信。
一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道。PipedOutputStream向管道中写入数据,PipedIntputStream读取PipedOutputStream向管道中写入的数据。一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。
PipedInputStream和PipedOutputStream实例
//Sender类 package pipeCommu; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class Sender extends Thread{ private PipedOutputStream out=new PipedOutputStream();//发送者创建PipedOutputStream向外写数据; public PipedOutputStream getOut(){ return out; } public void run(){ String strInfo="hello,receiver"; try{ out.write(strInfo.getBytes());//写入数据 out.close(); }catch(Exception e){ e.printStackTrace(); } } } |
//Reader类,负责接收数据 package pipeCommu; import java.io.PipedInputStream; public class Reader extends Thread{ private PipedInputStream in=new PipedInputStream();//发送者创建PipedOutputStream向外写数据 public PipedInputStream getIn(){ return in; } public void run(){ byte[] buf=new byte[1024];//声明字节数组 try{ int len=in.read(buf);//读取数据,并返回实际读到的字节数 System.out.println("receive from sender:"+new String(buf,0,len)); in.close(); }catch(Exception e){ e.printStackTrace(); } } } |
package pipeCommu; import java.io.*; public class PipedStream { public static void main(String[] args) throws Exception{ Sender send=new Sender(); Reader read=new Reader(); PipedOutputStream out=send.getOut(); PipedInputStream in=read.getIn(); out.connect(in);//或者也可以用in.connect(out); send.start(); read.start(); } } |
PipedReader和PipedWriter
package pipeCommu; import java.io.*; public class PipedCommu { public static void main(String[] args) { // TODO Auto-generated method stub try{ PipedReader reader=new PipedReader(); PipedWriter writer=new PipedWriter(reader); Thread a=new Send(writer); Thread b=new Read(reader); a.start(); Thread.sleep(1000); b.start(); }catch(IOException e){ e.printStackTrace(); }catch(InterruptedException e1){ e1.printStackTrace(); } } } class Send extends Thread{ PipedWriter writer; public Send(PipedWriter writer){ this.writer=writer; } public void run(){ try{ writer.write("this is a.hello world".toCharArray()); writer.close(); }catch(IOException e){ e.printStackTrace(); } } } class Read extends Thread{ PipedReader reader; public Read(PipedReader reader){ this.reader=reader; } public void run(){ System.out.println("this is B"); try{ char[] buf=new char[1000]; reader.read(buf,0,100); System.out.println(new String(buf)); }catch(Exception e){ e.printStackTrace(); } } } |