目录
1.介绍管道流
2.管道流的基本实现
3.管道流的使用场景及注意事项
一、介绍管道流
管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream),如果要想进行管道输出,则必须把输出流连在输入流之上。
管道流的模型如下:
利用管道流的这一特性我们可以在线程之间传递文件。
二、管道流的基本实现
管道流可以比作是一根管道,我们可以将输入和输出的管道相连,达到线程之间传递数据的目的。
以下是管道流的基本实现:
接收数据线程:
package io; import java.io.IOException; import java.io.PipedInputStream; /** * 接收线程 */ public class Recevie implements Runnable{ //管输入道流 private PipedInputStream pis = null; //构造方法 public Recevie() { this.pis = new PipedInputStream(); } @Override public void run() { //缓冲区 byte [] b = new byte[1024]; int len = 0; try { //将数据读取到b中 len = pis.read(b); } catch (IOException e) { e.printStackTrace(); }finally { try { pis.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("接收到的内容为:"+new String(b,0,len)); } public PipedInputStream getPis() { return pis; } }
发送数据线程:
package io; import java.io.IOException; import java.io.PipedOutputStream; /** * 发送线程 */ public class Send implements Runnable{ //管道输出流 private PipedOutputStream pos = null; public Send() { this.pos = new PipedOutputStream(); } @Override public void run() { String str = "hello piped"; try { pos.write(str.getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { try { pos.close(); } catch (IOException e) { e.printStackTrace(); } } } public PipedOutputStream getPos() { return pos; } }
链接管道并启动线程:
package io; import java.io.IOException; /** * 管道连接类 */ public class Pip { public static void main(String[] args) { Send send = new Send(); Recevie recevie = new Recevie(); try { send.getPos().connect(recevie.getPis()); } catch (IOException e) { e.printStackTrace(); } new Thread(send).start(); new Thread(recevie).start(); } }
三、管道流的使用场景及注意事项
在java API文档中的解释是这样的:
官方说明不建议使用单个线程,可能会死锁。所以在实际开发过程中要注意尽量不要写在单个线程中。
另外在jdk1.1中还出现了另外两个管道流:PipedReader和PipedWriter
这两个流是用来传递字符的。在使用范围上只能传递文本文件。不能用来传递多媒体文件。