今天做管道过滤器的试验,多个过滤器是多线程并行执行的,每个线程执行结束的条件是从前一个管道的read()方法返回-1,管道就是PipedReader,其read()返回-1的条件是读到文件流末尾。
下面我就刨根问底,看看究竟什么是文件流末尾。首先打开java开发包中的源代码,找到PipedReader类,找到其中的read()方法,其中有这么一段代码
if (closedByWriter) {
/* closed by writer, return EOF */
return -1;
}
接着再找closedByWriter,类定义的开始boolean closedByWriter = false;
synchronized void receivedLast() {
closedByWriter = true;
notifyAll();
}
哈哈,看来秘密在这里。但哪里调用的receivedLast()?原来是在PipedWriter中调用的,
public void close() throws IOException {
closed = true;
if (sink != null) {
sink.receivedLast();
}
}
至此,真相大白,要在向管道中写完最后一个字节之后,调用PipedWriter中的close函数。