java管道用于Thread间单向通信;
一、jdk1.4之前使用io包里的pipedStream
Demo:
/**
* 2021年5月12日下午2:46:39
*/
package testPipe;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* @author XWF
*
*/
public class TestPipedStream {
/**
* @param args
*/
public static void main(String[] args) {
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
try {
pis.connect(pos);
new Thread(() -> {
try {
byte[] bs = pis.readAllBytes();
System.out.println(new String(bs));
//需要关闭
pis.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
pos.write("abcd".getBytes());
//需要关闭
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:
二、jdk1.4有了nio包的Pipe
Demo:
/**
* 2021年5月10日上午9:32:52
*/
package testPipe;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
import java.nio.channels.Pipe.SinkChannel;
import java.nio.channels.Pipe.SourceChannel;
/**
* @author XWF
*
*/
public class TestPipe {
/**
* @param args
*/
public static void main(String[] args) {
try {
Pipe p = Pipe.open();
new Thread(() -> {
//写入
SinkChannel sinkCh = p.sink();
String str = "_";
for(int i = 1; i <= 5; i++) {
str += i;
ByteBuffer byteBuffer = ByteBuffer.wrap(str.getBytes());
try {
sinkCh.write(byteBuffer);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
sinkCh.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
//读取
SourceChannel sourceCh = p.source();
ByteBuffer byteBuffer = ByteBuffer.allocate(9);
while(true) {
try {
byteBuffer.clear();
int readLen = sourceCh.read(byteBuffer);
System.out.println("readLen=" + readLen);
if(readLen < 0) {
sourceCh.close();
break;
}
byteBuffer.flip();
byte[] bytes = new byte[readLen];
byteBuffer.get(bytes);
System.out.println(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行了几次结果: