介绍:不同的数据源之间通过建立管道进行数据通信。如图:
线程之间通信最好的方式就是采用管道机制,类似水管一样,水管可以对接,组合成各种具有过滤性质的管道,管道和线程灵活使用,可以提高效率。(Channel)信道复用机制。
class Recever implements Runnable {
PipedInputStream inputStream;
Recever(PipedInputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
try {
while (true) {
byte[] buffers = new byte[512];
int len = inputStream.read(buffers);
String s = new String(buffers, 0, len);
System.out.println("收到:" + s);
}
// inputStream.close();
} catch (Exception e) {
}
}
}
class Sender implements Runnable {
PipedOutputStream outputStream;
Sender(PipedOutputStream outputStream) {
this.outputStream = outputStream;
}
@Override
public void run() {
try {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String msg = scanner.nextLine();
outputStream.write(msg.getBytes());
outputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException,
IOException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
new Thread(new Recever(in)).start();
new Thread(new Sender(out)).start();
}
//数据流的合并-读取几个文件的内容输入到下一个文件
InputStream in1 = new FileInputStream("c:/a1.txt");
InputStream in2 = new FileInputStream("c:/a2.txt");
InputStream in3 = new FileInputStream("c:/a3.txt");
Vector<InputStream> inputStreams = new Vector<InputStream>();
inputStreams.add(in1);
inputStreams.add(in2);
inputStreams.add(in3);
Enumeration<? extends InputStream> enumeration = inputStreams.elements();
SequenceInputStream inputStream = new SequenceInputStream(enumeration );
OutputStream os = new FileOutputStream("c:/a4.txt");
byte[] buffer = new byte[512];
int length = -1;
while((length = inputStream.read(buffer))!=-1){
os.write(buffer, 0, length);
os.flush();
}
os.close();
inputStream.close();
//内存读取
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
arrayOutputStream.write("test".getBytes());
arrayOutputStream.flush();
byte[] buffer = arrayOutputStream.toByteArray();
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buffer );