2012-12-04 28 views
0

我正在嘗試實現一個解釋管道& Line數據流體系結構的程序。 我有一個數據源和許多過濾器,數據源類在管道上寫入一個字符數組(使用PipeWriter),第一個過濾器從管道中讀取數組並將字符轉換爲upperCase,然後寫入大寫字母數組字符放入同一個管道中,以便被下一個過濾器讀取,等等。 我在我的應用程序中使用多線程。 這裏是一些代碼,或許可以解釋我想要做的事:java.io.IOException:使用pipeWriter和pipeReader時會出現管道關閉

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

我真的需要幫助!我不知道是什麼問題,它是我第一次處理PipeReader和Writer :(:( –

回答

0

「,然後將大寫字母數組寫入同一個管道中,以便被下一個過濾器讀取」 - 這是錯誤的。如果你寫入同一個管道,它自己讀取(使無限循環),而不是下一個過濾器。

我猜你想要的東西,如:

數據源=> pw1-> PR1 => UpperCaseConversionFilter => pw2-> PR2 =>下一個過濾器

所以你需要2對以上的(PipedWriter, PipedReader)。

相關問題