2013-03-07 66 views
1

我正在通過runtime.exec運行一個需要一些時間的命令。我想更新我的ProgressBar。
我已經得到了我想要的系統輸出,問題是:當這個過程完成時,我立即得到它。而不是一步一步來更新我的進度...運行時立即獲得系統輸出(更新ProgressBar)Java

下面是一些代碼

public Runtime rt = Runtime.getRuntime(); 
public Process pp; 

    public doit() { 
     try { 
      pp = rt.exec(a_long_timed_process); 
      InputStream is = pp.getErrorStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       if (line.contains("In:")) { 
        int a = line.indexOf("In:");    //get a string 
        int b = line.lastIndexOf("%");   //between 
        String lineout = line.substring(a + 3, b);//"0.00" and "99.99" 
        double nr = Double.parseDouble(lineout); //make it a double 
        int round = (int) nr;      //make it a usable int 
        System.out.println(round); 
        myProgressBar.setValue(round);   //UPDATE Progressbar 
       } 
      } 
      pp.waitFor(); 
     } catch (IOException ex) { 
      Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

每一個幫助表示讚賞提前
感謝

+1

不要阻塞EDT(Event Dispatch Thread) - 當發生這種情況時GUI將「凍結」。而不是調用'Thread.sleep(n)'實現一個Swing'Timer'來重複執行任務,或者一個'SwingWorker'執行長時間運行的任務。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2013-03-08 00:08:45

回答

3

你必須如果您希望能夠同時處理其輸出,請在另一個線程中運行該進程。一個好的方法是使用ProcessBuilder

從文檔:

此類用於創建操作系統進程。

[...]

開始,它使用默認工作目錄和 環境的新工藝很簡單:

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

下面是啓動一個進程有一個例子修改後的目錄和環境 ,並將標準輸出和錯誤重定向到 被附加到日誌文件:

ProcessBuilder pb = 
    new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
File log = new File("log"); 
pb.redirectErrorStream(true); 
pb.redirectOutput(Redirect.appendTo(log)); 
Process p = pb.start(); 
assert pb.redirectInput() == Redirect.PIPE; 
assert pb.redirectOutput().file() == log; 
assert p.getInputStream().read() == -1; 

另請參閱here另一個代碼示例,您可以根據自己的需要進行調整。

1

您將看到啓動過程中輸出緩衝的效果。在Java代碼中你無能爲力。