2011-12-05 47 views
0

我试图运行一个需要很长时间才能在java程序中完成的程序。 Java程序内部的程序输出一个巨大的文件(大约4到6 GB之间)。我在主要方法中使用下面的代码。在java程序中运行命令行程序

//get the runtime goinog 
Runtime rt = Runtime.getRuntime(); 
//execute program 
Process pr = rt.exec("theProgram.exe"); 
//wqit forprogram to finish 
pr.waitFor(); 

我得到了一些错误:

  • 当Java程序结束theProgram.exe不会停止有时当theProgram.exe已经结束
  • java程序甚至从来没有结束
  • Program程序停止未完成,并且Java程序不停止。

的更多信息:

  • 我用的cygwin在Windows7
+0

请解释一下你的了'theProgram.exe'意思站没有完成 –

+0

我的意思是,我知道预期的结果因为我直接在命令行上运行它,但是当我在java程序中运行它时,它有时停止,并且我看不到相同的结果。在这些情况下,java程序不会停止运行 –

+0

如果进程有有用的输出来衡量其进度,请尝试重定向其输出,如我在答案中所示。 –

回答

1

调用此方法与你的Process pr终止该进程当你的java程序退出:

private void attachShutdownHook(final Process process) { 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      process.destroy(); 
     } 
    }); 
} 

如果你的进程有输出,您可以用它来评估其进展情况,然后重定向输出到Java通过电话:

private void redirectOutputStreamsToConsole(Process process) { 
    redirectStream(process.getInputStream(), System.out); 
    redirectStream(process.getErrorStream(), System.err); 
} 

private void redirectStream(final InputStream in, final PrintStream out) { 
    new Thread() { 
     @Override 
     public void run() { 
      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
       String line = null; 
       while ((line = reader.readLine()) != null) 
        out.println(line); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    }.start(); 
} 
+0

我可以在程序的最后添加pr.destroy()吗? –

+0

这是最好的,因为大多数程序可以有多个出口点,例如,如果它意外抛出一个'Exception',你可能想要确保进程终止。 –

+0

这个工作很好,现在如果我不想显示进度输出,我应该改变什么。谢谢 –

1

这将是一个好主意,包括pr.destroy()在Java代码末尾,以便结束处理当你的程序结束。这解决了错误#1

pr.exitValue()在这些情况下返回什么?

+0

我将包括pr.destroy(),我会用pr.exitValue()来执行一次并返回给您。谢谢 –