http://jjd3ei.blog.163.com/blog/static/1995212642012116940210/
管道流类PipedInputStream类和PipedOutputStream类用于在应用程序中创建管道通信。一个PipedInputStream实例对象必须和PipedOutputStream实例对象进行连接而产生一个通信管道,PipedOutputsStream可以向管道中写入数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据,这两个类主要用来完成线程之间的通信,一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。
下面来看一个两个线程之间互相通信的例子:
建一个发送者的类:
Sender.java
[java] view plain copy
- packagecom.richer.io;
- importjava.io.IOException;
- importjava.io.PipedOutputStream;
- /**
- *该类用于向另外一个线程发送数据,也就是发送者
- *@authorIsFung
- */
- publicclassSenderextendsThread{
- privatePipedOutputStreamoutputStream=newPipedOutputStream();//首先先创建一个发送对象
- publicPipedOutputStreamgetOutputStream(){//得到输出流
- returnoutputStream;
- }
- publicvoidrun(){
- StringstrInfo=newString("Hello!Welcometomyspace!");//发送的数据
- try{
- outputStream.write(strInfo.getBytes());
- outputStream.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
再建一个接收者的类:
Receiver.java
[java] view plain copy
- packagecom.richer.io;
- importjava.io.IOException;
- importjava.io.PipedInputStream;
- /**
- *接收者
- *@authorIsFung
- */
- publicclassReceiverextendsThread{
- privatePipedInputStreaminputStream=newPipedInputStream();//读取对象
- publicPipedInputStreamgetInputStream(){
- returninputStream;
- }
- publicvoidrun(){
- byte[]bytes=newbyte[1024];
- try{
- intlength=inputStream.read(bytes);//接收数据
- System.out.println("接收到的信息如下:/n"+newString(bytes,0,length));//打印出收到的信息
- inputStream.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
最后我们编写一个控制程序:
PipedStreamTest.java
[java] view plain copy
- packagecom.richer.io;
- importjava.io.IOException;
- importjava.io.PipedInputStream;
- importjava.io.PipedOutputStream;
- publicclassPipedStreamTest{
- /**
- *控制程序
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- Sendersender=newSender();
- Receiverreceiver=newReceiver();
- PipedOutputStreamoutputStream=sender.getOutputStream();
- PipedInputStreaminputStream=receiver.getInputStream();
- try{
- //两个管道相连接
- //inputStream.connect(outputStream);这2种都可以
- outputStream.connect(inputStream);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- //启动线程
- sender.start();
- receiver.start();
- }
- }
运行该程序的时候应该会在命令行输出以下信息:
接收到的信息如下:
Hello! Welcome to my space!
另外,JDK还提供了PipedReader和PipedWriter类,用来处理字符文本的管道通信。它们和PipedInputStream类和PipedOutputStream类使用方法很类似,这里Richer就不多介绍了。
使用管道流类可以实现各个程序模块之间的松耦合通信,使用管道流类进行通信的模块,具有强内聚弱耦合的特点,一块模块被替换不会影响到其他的模块。这样就可以在程序中灵活的将多个这样的模块的输入流和输出流相连,以拼装成满足各种应用的程序,而不用对模块内部进行修改。上面例子程序中的Sender和Receiver的输入和输出管道相连,Sender发送的数据就被Receiver接收到了。
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。