我正在尝试实施一个解释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);
}
}
}
任何人都可以帮我解决这个问题吗?!!
答案 0 :(得分:0)
“然后将upperCase字符数组写入同一个Pipe中,以便下一个过滤器读取” - 这是错误的。如果您写入同一个管道,它将自行读取(进行无限循环),而不是下一个过滤器。
我想你想要的东西是:
DataSource => pw1-> pr1 => UpperCaseConversionFilter => pw2-> pr2 =>下一个过滤器
所以你需要2对或更多对(PipedWriter,PipedReader)。