管道流
管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream,PipedWriter)、管道输入流(PipedInputStream,PipedReader)。
一个PipedInputStream(PipedReader) 对象必须和一个PipedOutputStream(PipedWriter) 对象进行连接而产生一个通信管道。
PipedOutputStream(PipedWriter) 可以向管道中写入数据,PipedInputStream(PipedReader) 可以从管道中读取 PipedOutputStream(PipedWriter) 写入的数据:
如果要想进行管道输出,则必须把输出流和输入流连上,在PipedOutputStream(或者 PipedInputStream)类上有一个方法用于连接管道:
public void connect(PipedInputStream snk)throws IOException
或者
public void connect(PipedOutputStream src)throws IOException
调用上面的任何一个方法都可以,效果是一样的。
PipedInputStream使用一个固定大小(初始化指定或默认)的循环缓冲区,写入PIpedOutputStream的数据实际上保存到对应的PipedInputStream的内部缓冲区。从PipedInputStream执行读操作时,读取的数据实际上来自这个内部缓冲区。如果对应的PipedInputStream输入缓冲区已满,任何企图写入PipedOutputStream的线程都将阻塞,直到有读取PipedInputStream的操作从缓冲区中删除数据。
因此,向PipedOutputStream写入数据的线程和从PipedInputStream读取数据的线程通常不应该是一个线程(一个线程也没有什么意义)。
- 当从PipedInputStream读取数据时:
如果此时恰好PipedInputStream的缓冲区为空,且同时向PipedOutputStream写数据的线程不在活动(Thread.isAlive()检测);将会抛出一个IOException。
- 当向PipedOutputStream写入数据时:
如果从对应的PipedInputStream读取数据的线程不在活动,将抛出一个异常。
使用实例
PipedApp.java
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.IOException;
class Sender extends Thread {
private PipedOutputStream out =null;
public PipedOutputStream getOutputStream(){
this.out=new PipedOutputStream();
return out;
}
public void run(){
String s = new String("Receiver,你好!");
try {
out.write( s.getBytes() );
out.close();
}catch (IOException e){
System.out.println( e.getMessage() );
}
}
}
class Eeceiver extends Thread {
private PipedInputStream in = new PipedInputStream();
public PipedInputStream getinputStream(){
return in;
}
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("收到了一下消息:"+s);
in.close();
}catch (IOException e) {
System.out.println( e.getMessage() );
}
}
}
public class PipedApp {
public static void main(String[] args){
try{
Sender sender = new Sender();
Eeceiver receiver = new Eeceiver();
PipedOutputStream out = sender.getOutputStream();
PipedInputStream in = receiver.getinputStream();
out.connect(in);
sender.start();
receiver.start();
} catch (IOException e) {
System.out.println(e.getMessage() );
}
}
}