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 => 次のフィルター

したがって、(PipedWriter、PipedReader) のペアが 2 つ以上必要です。

于 2012-12-05T05:46:26.103 に答える