2011-12-05 151 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()來執行一次並返回給您。謝謝 –