管道流是指在两个线程之间进行IO操作。
管道流同样分为字节管道流和字符管道流。
此例只采用字节管道流。
PipedInputStream:管道输入流
重要方法:public void connect(PipedOutputStream src) throws IOException
PipedOutputStream:管道输出流
重要方法:public synchronized void connect(PipedInputStream snk) throws IOException
connect用于两个管道流之间的连接,因此非常重要
示例,一个线程发送数据,一个线程接收数据
发送管道
class SendMessage implements Runnable{
//管道输出流
private PipedOutputStream out ;
public SendMessage() {
out = new PipedOutputStream();
}
public PipedOutputStream getOut() {
return out;
}
@Override
public void run() {
try {
//输出流中输出信息
out.write("发送的信息".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
接收管道
class RecevidMessage implements Runnable {
//管道输入流
private PipedInputStream in;
public RecevidMessage() {
in = new PipedInputStream();
}
public PipedInputStream getIn() {
return in;
}
@Override
public void run(){
//流中读取信息并控制台打印
byte[] b = new byte[1024];
try {
in.read(b);
System.out.println("接收信息:"+new String(b));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试
public static void main(String[] args) throws Exception {
//构建两个道理
SendMessage sendMessage = new SendMessage();
RecevidMessage recevidMessage = new RecevidMessage();
//管道连接,发送和接收仅连接一处即可
//recevidMessage.getIn().connect((PipedOutputStream) sendMessage.getOut());
sendMessage.getOut().connect(recevidMessage.getIn());
//启动线程
new Thread(sendMessage).start();
new Thread(recevidMessage).start();
}