管道流类PipedInputStream类和PipedOutputStream类用于在应用程序中创建管道通信。一个PipedInputStream实例对象必须和PipedOutputStream实例对象进行连接而产生一个通信管道,PipedOutputsStream可以向管道中写入数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据,这两个类主要用来完成线程之间的通信,一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。
不要写在一个线程当中,因为如果写在同一个线程中肯那个造成deadlock。同时不要调用线程的run方法,因为调用这个方法是在主线程中运行,同样不是多线程。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ioexercise;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author kevin
*/
public class pipeStream {
public static void main(String [] arg)
{
producer pro=new producer();
receiver rec=new receiver();
PipedOutputStream out=pro.getPipedOutputStream();
PipedInputStream in =rec.getOipedInputStream();
try {
out.connect(in);
} catch (IOException ex) {
Logger.getLogger(pipeStream.class.getName()).log(Level.SEVERE, null, ex);
}
pro.start();
rec.start();
}
}
class producer extends Thread{
protected PipedOutputStream pro=new PipedOutputStream();
producer ()
{
super();
}
public PipedOutputStream getPipedOutputStream()
{
return pro;
}
@Override
public void run() {
String product ="if you receive this message,you were successfull";
try {
pro.write(product.getBytes());
pro.close();
} catch (IOException ex) {
Logger.getLogger(producer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
class receiver extends Thread{
byte[]b=new byte[1023];
protected PipedInputStream pin=new PipedInputStream();
receiver(){
super();
}
public PipedInputStream getOipedInputStream(){
return pin;
}
@Override
public void run() {
try {
pin.read(b);
pin.close();
} catch (IOException ex) {
Logger.getLogger(receiver.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(new String(b));
}
}