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

时间:2012-12-04 15:58:52

标签: java multithreading pipeline

我正在尝试实施一个解释Pipe& Line数据流架构的程序。 我有一个数据源和许多过滤器,数据源类在管道上写入一个字符数组(使用PipeWriter),第一个过滤器从管道读取数组并将字符转换为upperCase然后写入upperCase字符数组进入同一个管道,以便由下一个过滤器读取,依此类推。 我在我的应用程序中使用多线程。 这里有一些代码可以解释我想要做的事情:

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);
    }
    }



     }

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

1 个答案:

答案 0 :(得分:0)

“然后将upperCase字符数组写入同一个Pipe中,以便下一个过滤器读取” - 这是错误的。如果您写入同一个管道,它将自行读取(进行无限循环),而不是下一个过滤器。

我想你想要的东西是:

DataSource => pw1-> pr1 => UpperCaseConversionFilter => pw2-> pr2 =>下一个过滤器

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