我正在通过runtime.exec运行命令需要一些时间。我希望更新我的ProgressBar。
我已经得到了我想要的系统输出,问题是:当过程完成时我立即得到它。而不是一步一步地更新我的ProgressBar ......
这是一些代码
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);
}
}
感谢每一位帮助。提前致谢
答案 0 :(得分: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 :(得分:1)
您在启动过程中看到输出缓冲的效果。您无法在Java代码中做到这一点。