我正在尝试实现一个解释 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);
}
}
}
谁能帮我解决这个问题?!!