java.io.IOException:使用 pipeWriter 和 pipeReader 时出现管道关闭



我正在尝试实现一个解释Pipe&Line数据流架构的程序。我有一个数据源和许多过滤器,数据源类在管道上写入一个字符数组(使用 PipeWriter),第一个过滤器从管道中读取数组并将字符转换为大写,然后将大写字符数组写入同一个管道,以便下一个过滤器读取,依此类推。我正在我的应用程序中使用多线程。以下是一些代码,可以解释我正在尝试执行的操作:

public class DataSource implements Runnable{
   PipedWriter pw;
   public char[] c  = {'e','a','b','c','e','c','a','f','e','d'};
   public DataSource(PipedWriter pw){
        this.pw = pw;
   }
public  synchronized  void run() {
    try {
        pw.write(c);
        pw.write(-1);
        pw.close();
    } catch (IOException ex) {
        Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex);
    }

}
 }

public class UpperCaseConversionFilter implements Runnable{
PipedReader pr;
PipedWriter pw;
char[] upperCaseLetters;
public UpperCaseConversionFilter(PipedReader pr,PipedWriter pw){
    this.pr = pr;
    this.pw = pw;
    upperCaseLetters = new char[10];
}
public synchronized void run() {
    try {
        int i;
        int d = 0 ;
        while ((i = pr.read()) != -1) {
           char y = (char)i;
           upperCaseLetters[d] = Character.toUpperCase(y);
           d++;
       }
           pw.write(upperCaseLetters);   // here apperas the exception
           pw.write(-1);
           pw.close();
    } catch (IOException ex) {
        Logger.getLogger(UpperCaseConversionFilter.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

这是我测试代码的方式:

 public static  void facadDetails(){
    PipedWriter pw = null;
    PipedReader pr = null;
    try {
        // TODO code application logic here
        pr = new PipedReader();
        pw = new PipedWriter(pr);
        DataSource dso = new DataSource(pw);
        UpperCaseConversionFilter f1 = new UpperCaseConversionFilter(pr,pw);
        new Thread(dso).start();
        new Thread(f1).start();
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

     }

任何人都可以帮我解决这个问题?!!

"然后将大写字符数组写入同一个管道,以便下一个过滤器读取" - 这是错误的。如果写入同一管道,则会自行读取(进行无限循环),而不是下一个筛选器。

我猜你想要这样的东西:

数据源 => pw1->pr1 => 大写转换筛选器 => pw2->pr2 =>下一个筛选器

所以你需要2对或更多对(PipedWriter,PipedReader)。