2010-04-25 61 views
1

使用SwingWorker時,保證傳送的正確方法是什麼?我試圖將數據從InputStream路由到JTextArea,並使用execute方法運行我的SwingWorker。我認爲我遵循here的示例,但是我得到的結果是亂碼,重複的和一般的廢話。Swingworker生產重複的輸出/輸出不按順序?

這裏是我的非工作的SwingWorker:從輸入流中讀取後

class InputStreamOutputWorker extends SwingWorker<List<String>,String> { 

    private InputStream is; 
    private JTextArea output; 

    public InputStreamOutputWorker(InputStream is, JTextArea output) { 
     this.is = is; 
     this.output = output; 
    } 

    @Override 
    protected List<String> doInBackground() throws Exception { 
     byte[] data = new byte[4 * 1024]; 
     int len = 0; 

     while ((len = is.read(data)) > 0) { 
      String line = new String(data).trim(); 
      publish(line); 
     } 

     return null; 
    } 

    @Override 
    protected void process(List<String> chunks) 
    { 
     for(String s : chunks) 
     { 
      output.append(s + "\n"); 
     } 
    } 
} 
+1

您是否一次運行多個工人? – TofuBeer 2010-04-25 00:52:38

+0

你有沒有試過在Swing Dispatcher Thread中運行它? 除非你的輸入流很慢(> 1秒),那麼我會把它放在DispatchThread中。 沒有足夠的代碼或上下文來識別任何問題。 – 2010-04-25 01:00:53

+0

一次只能運行一個工作人員,並且輸入流將持續數小時的數據。 – 2010-04-25 01:15:37

回答

-1

清除您的數據陣列。

while ((len = is.read(data)) > 0) { 
       String line = new String(data).trim(); 
       publish(line); 
       Arrays.fill(data,(byte)0); 
} 
+0

-1 - 閱讀API或Fred的答案;你正在創建一個帶有大量NUL字符的字符串 – kdgregory 2010-04-25 12:32:10

+0

不是真的,修剪會照顧它。這可能效率稍低,但這並不是我的瓶頸在這個應用程序中。 is.read()需要大約1秒的響應時間,所以我在循環中做的任何事情都基本上是免費的。如果可以,我會-1對您的預優化評論。 – 2010-04-25 15:46:23

1

您需要創建的字符串時要使用的「len個」值:

String line = new String(data,0,len).trim(); 

另外,我建議你換你的InputStream在一個BufferedReader和使用「的readLine()方法:

BufferedReader reader = new BufferedReader(is); 
... 
String line = reader.readLine()