管道流
管道流的功能是实现两个线程之间的IO操作。
对于管道流也分为两类:
- 字节管道流:
- PipedInputStream:
连接处理:public void connect(PipedOutputStream src) throws IOException
- PipedOutputStream:
- 字符管道流:
- PipedWriter
连接处理:public void connect(PipedOutput src) throws IOException
- PopedWriter
范例:实现管道操作
package IO深入操作;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class 管道流 {
public static void main(String[] args) {
SendThread sendThread = new SendThread();
ReceiveThread receiveThread = new ReceiveThread();
try {
sendThread.getOutput().connect(receiveThread.getInput()); //进行管道连接
} catch (IOException e) {
e.printStackTrace();
}
new Thread(sendThread,"消息发送线程").start();
new Thread(receiveThread,"消息接收线程").start();
}
}
class SendThread implements Runnable{
private PipedOutputStream output; //管道输出流
public SendThread(){
this.output = new PipedOutputStream(); //实例化管道输出流
}
@Override
public void run() {
for(int x = 0;x < 10;x++){
try { //利用管道实现数据发送处理
this.output.write((Thread.currentThread().getName()+"第"+(x+1)+"次信息\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
try {
this.output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public PipedOutputStream getOutput(){
return this.output;
}
}
class ReceiveThread implements Runnable{
private PipedInputStream input;
public ReceiveThread(){
this.input = new PipedInputStream();
}
@Override
public void run(){
byte[] data = new byte[1024];
try {
int len = this.input.read(data); //保存数据到data并记录长度
System.out.println(Thread.currentThread().getName()+"接收"+new String(data,0,len)); //输出data
} catch (IOException e) {
e.printStackTrace();
}
try {
this.input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public PipedInputStream getInput(){
return this.input;
}
}
消息接收线程接收消息发送线程第1次信息
消息发送线程第2次信息
消息发送线程第3次信息
消息发送线程第4次信息
消息发送线程第5次信息
消息发送线程第6次信息
消息发送线程第7次信息
消息发送线程第8次信息
消息发送线程第9次信息
消息发送线程第10次信息
管道就类似与医院打点滴的效果,一个只负责发送,一个只负责接收,中间靠管道连接。