普通输入输出流必须通过变量或者数组中转。而管道输入输出流可以直接关联。管道流要结合多线程使用。因为read()会阻塞,如果输入输出流在同一个线程,read()没有数据一直等待,造成死锁。管道输入流提供要写入管道输出流的所有数据字节。
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedDemo {
public static void main(String[] args) throws IOException {
PipedInputStream input = new PipedInputStream();
PipedOutputStream output = new PipedOutputStream();
input.connect(output);
new Thread(new Input(input)).start();
new Thread(new Output(output)).start();
}
}
class Input implements Runnable{ //没有输入源,此处会导致死锁
private PipedInputStream in;
Input(PipedInputStream in){
this.in = in;
}
public void run() {
byte[] buffer = new byte[1024];
int len = 0;
try {
len = in.read(buffer);
String s = new String(buffer,0,len);
System.out.println("s="+s);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Output implements Runnable{
private PipedOutputStream out;
Output(PipedOutputStream out){
this.out = out;
}
public void run() {
System.out.println("run");
}
}