Welcome 微信登录

首页 / 软件开发 / JAVA / java io学习(十九) PipedReader和PipedWriter

java io学习(十九) PipedReader和PipedWriter2014-08-12本章,我们学习PipedReader和PipedWriter。它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信。

PipedWriter 是字符管道输出流,它继承于Writer。

PipedReader 是字符管道输入流,它继承于Writer。

PipedWriter和PipedReader的作用是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedReader配套使用。

PipedWriter和PipedReader源码分析

1. PipedWriter 源码(基于jdk1.7.40)

package java.io; public class PipedWriter extends Writer { // 与PipedWriter通信的PipedReader对象private PipedReader sink; // PipedWriter的关闭标记private boolean closed = false; // 构造函数,指定配对的PipedReaderpublic PipedWriter(PipedReader snk)throws IOException {connect(snk);} // 构造函数public PipedWriter() {} // 将“PipedWriter” 和 “PipedReader”连接。public synchronized void connect(PipedReader snk) throws IOException {if (snk == null) {throw new NullPointerException();} else if (sink != null || snk.connected) {throw new IOException("Already connected");} else if (snk.closedByReader || closed) {throw new IOException("Pipe closed");} sink = snk;snk.in = -1;snk.out = 0;// 设置“PipedReader”和“PipedWriter”为已连接状态// connected是PipedReader中定义的,用于表示“PipedReader和PipedWriter”是否已经连接snk.connected = true;} // 将一个字符c写入“PipedWriter”中。// 将c写入“PipedWriter”之后,它会将c传输给“PipedReader”public void write(int c)throws IOException {if (sink == null) {throw new IOException("Pipe not connected");}sink.receive(c);} // 将字符数组b写入“PipedWriter”中。// 将数组b写入“PipedWriter”之后,它会将其传输给“PipedReader”public void write(char cbuf[], int off, int len) throws IOException {if (sink == null) {throw new IOException("Pipe not connected");} else if ((off | len | (off + len) | (cbuf.length - (off + len))) < 0) {throw new IndexOutOfBoundsException();}sink.receive(cbuf, off, len);} // 清空“PipedWriter”。// 这里会调用“PipedReader”的notifyAll();// 目的是让“PipedReader”放弃对当前资源的占有,让其它的等待线程(等待读取PipedWriter的线程)读取“PipedWriter”的值。public synchronized void flush() throws IOException {if (sink != null) {if (sink.closedByReader || closed) {throw new IOException("Pipe closed");}synchronized (sink) {sink.notifyAll();}}} // 关闭“PipedWriter”。// 关闭之后,会调用receivedLast()通知“PipedReader”它已经关闭。public void close()throws IOException {closed = true;if (sink != null) {sink.receivedLast();}}}