2013-03-07 54 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代码中你无能为力。