代码改变世界

管道流PiedInputStream和PipeOutputStream

2012-03-18 18:39  党飞  阅读(849)  评论(0)    收藏  举报

---------------------- android培训java培训、期待与您交流! ----------------------

以前我们操作流的时候,输出流和输入流是没有关系的,读写文件时要有一个中转站(例如byte数组)。

但管道流的输入流和输出流是连接的,就像一个管道的两端。看看管道输出流的API:

可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态。

从这里我们不难看出,管道流的操作过程,管道的两端要分别启动一个线程,管道输入端写入数据,管道输出端读取数据。

下面看一个具体实现过程:

public class Test1 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
        PipedInputStream in=new PipedInputStream();
        PipedOutputStream out = new PipedOutputStream();
        try {
   in.connect(out);
   Read r = new Read(in);
   Write w = new Write(out);
   new Thread(r).start();
   new Thread(w).start();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
       
 }
 

}
class Read implements Runnable{
 private PipedInputStream in;
 Read(PipedInputStream in){
  this.in=in;
  
 }
 public void run(){
  try{
   byte[] buf = new byte[1024];
   int len = in.read(buf);
   String str= new String(buf,0,len);
   System.out.println(str);
   in.close();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
}

class Write implements Runnable{
     
 private PipedOutputStream out;
 Write(PipedOutputStream out){
  this.out=out;
 }
 public void run(){
  try {
   out.write("dei dei".getBytes());
   out.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}

---------------------- android培训java培训、期待与您交流! ----------------------