管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(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的缓冲区为空,且同时向PipedOutputStream写数据的线程不在活动(Thread.isAlive()检测);将会抛出一个IOException。
如果从对应的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() ); } } }