Java中提供了很多Stream来对数据进行操作。PipeStream是一种特殊的流,用于在不同的线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助类似临时文件之类的东西。
JDK中提供了四个类:PipedInputStream,PipedOutputStream;PipedReader,PipedWriter。
示例代码如下:
public class ReadData {
public void read(PipedInputStream in) {
try {
System.out.println("read : ");
byte[] bytes = new byte[20];
int readLen = in.read(bytes);
while (readLen != -1) {
String newData=new String(bytes,0,readLen);
System.out.println(newData);
readLen=in.read(bytes);
}
System.out.println();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class WriteData {
public void write(PipedOutputStream out){
try {
System.out.println("write : ");
for(int i=0;i<300;i++){
String outData=""+(i+1);
out.write(outData.getBytes());
}
System.out.println();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class WriteThread extends Thread{
private WriteData write;
private PipedOutputStream out;
public WriteThread(WriteData write,PipedOutputStream out){
this.write=write;
this.out=out;
}
@Override
public void run() {
write.write(out);
}
}
class ReadThread extends Thread{
private ReadData read;
private PipedInputStream in;
public ReadThread(ReadData read,PipedInputStream in){
this.read=read;
this.in=in;
}
@Override
public void run() {
read.read(in);
}
}
public class Run {
public static void main(String[] args) {
try {
WriteData writeData=new WriteData();
ReadData readData=new ReadData();
PipedInputStream in=new PipedInputStream();
PipedOutputStream out=new PipedOutputStream();
out.connect(in);
ReadThread readThread=new ReadThread(readData,in);
readThread.start();
Thread.sleep(2000);
WriteThread writeThread=new WriteThread(writeData,out);
writeThread.start();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果:
read :
write :
12345678910111213141
51617181920212223242
52627282930313233343
53637383940414243444
54647484950515253545
55657585960616263646
...