【Java.IO】I/O 【字节/字符】【节点流】 - 之 - 【管道流】 - Piped*

管道流

管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream,PipedWriter)、管道输入流(PipedInputStream,PipedReader)。


一个PipedInputStream(PipedReader) 对象必须和一个PipedOutputStream(PipedWriter) 对象进行连接而产生一个通信管道


PipedOutputStream(PipedWriter) 可以向管道中写入数据,PipedInputStream(PipedReader) 可以从管道中读取 PipedOutputStream(PipedWriter) 写入的数据:

【Java.IO】I/O 【字节/字符】【节点流】 - 之 - 【管道流】 - Piped*_第1张图片

如果要想进行管道输出,则必须把输出流和输入流连上,在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() );  
          }  
	}
}




你可能感兴趣的:(java,IO)