0

我正在尝试实现一个解释 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);
    }
    }



     }

谁能帮我解决这个问题?!!

4

1 回答 1

0

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

我猜你想要类似的东西:

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

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

于 2012-12-05T05:46:26.103 回答