使用方法
PipedReader和PipedWriter即管道输入流和输出流,可用于线程间管道通信。它们和PipedInputStream/PipedOutputStream区别是前者操作的是字符后者是字节。
方法介绍
PipedReader提供的API如下:
//构造方法
PipedReader(PipedWriter src) //使用默认的buf的大小和传入的pw构造pr
PipedReader(PipedWriter src, int pipeSize) //使用指定的buf的大小和传入的pw构造pr
PipedReader() //使用默认大小构造pr
PipedReader(int pipeSize) //使用指定大小构造pr
//关闭流
void close()
//绑定Writer
void connect(PipedWriter src)
//是否可读
synchronized boolean ready()
//读取一个字符
synchronized int read()
//读取多个字符到cbuf
synchronized int read(char cbuf[], int off, int len)
//Writer调用, 向Reader缓冲区写数据
synchronized void receive(int c)
synchronized void receive(char c[], int off, int len)
synchronized void receivedLast()
PipedWriter提供的API如下:
//构造方法
PipedWriter(PipedReader snk)
PipedWriter()
//绑定Reader Writer
synchronized void connect(PipedReader snk)
//关闭流
void close()
//刷新流,唤醒Reader
synchronized void flush()
//写入1个字符,实际是写到绑定Reader的缓冲区
void write(int c)
//写入多个字符到Reader缓冲区
void write(char cbuf[], int off, int len)
使用示例
/**
* 写线程
*/
public class Producer extends Thread {
//输出流
private PipedWriter writer = new PipedWriter();
public Producer(PipedWriter writer) {
this.writer = writer;
}
@Override
public void run() {
try {
StringBuilder sb = new StringBuilder();
sb.append("Hello World!");
writer.write(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 读取线程
*/
public class Consumer extends Thread{
//输入流
private PipedReader reader = new PipedReader();
public Consumer(PipedReader reader) {
this.reader = reader;
}
@Override
public void run() {
try {
char [] cbuf = new char[20];
reader.read(cbuf, 0, cbuf.length);
System.out.println("管道流中的数据为: " + new String(cbuf));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@org.junit.Test
public void testPipedReaderWriter() {
/**
* 管道流通信核心是,Writer和Reader公用一块缓冲区,缓冲区在Reader中申请,
* 由Writer调用和它绑定的Reader的Receive方法进行写.
*
* 线程间通过管道流通信的步骤为
* 1 建立输入输出流
* 2 绑定输入输出流
* 3 Writer写
* 4 Reader读
*/
PipedReader reader = new PipedReader();
PipedWriter writer = new PipedWriter();
Producer producer = new Producer(writer);
Consumer consumer = new Consumer(reader);
try {
writer.connect(reader);
producer.start();
consumer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果如下:管道流中的数据为: Hello World!