2012-11-29 47 views
0

我想從java文件運行以下內容。
我試圖顯示的PHP版本,後來將更改爲運行PHP文件。從Java運行PHP

Process p = Runtime.getRuntime().exec("cmd /C PHP/php.exe -v"); 
BufferedReader in = new BufferedReader(new InputStreamReader(
       p.getInputStream())); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 

當我運行該程序時,沒有錯誤。但控制檯未顯示任何內容:(
謝謝

回答

4

你必須wait的進程來執行,你必須單獨的參數:BTW你在運行一個問題任何時候

Process p = Runtime.getRuntime().exec("cmd", "/C", "PHP/php.exe", "-v"); 
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
p.waitFor(); 
String line = null; 
while ((line = in.readLine()) != null) { 
    System.out.println(line); 
} 

,一個過程,這也是看the error stream一個好主意

+0

爲什麼要等待過程有什麼區別?如果有任何來自'php'的輸出,它將在*進程退出之前寫入*。如果在讀取輸出之前等待,則可能導致管道死鎖。 –

+0

仍然不能正常工作,只是顯示終止:( – Ken

+0

@肯 - 是的...因爲這不是解決方案。 –

3

我懷疑問題是下列之一:

  • php.exe根本沒有運行,例如,因爲PHP/php.exe應該是PHP\php.exe什麼的。
  • 該命令將版本信息寫入其「錯誤」流而不是其「輸出」流。

無論哪種方式,您都需要嘗試從錯誤流中讀取數據。您應該查看版本信息或cmdphp.exe的錯誤消息。


我還應該詳細解釋爲什麼@ dystroy的答案是錯誤的。

exec做的是創建一個新的外部進程來運行該命令。此進程連接到JVM,以便當您的應用程序寫入getOutput()流時,該流將轉到外部進程「標準輸入」,並且當外部進程寫入其「標準輸出」和「標準錯誤」時,數據可分別使用getInput()getError()流讀取。

各個流之間的連接使用操作系統提供的「管道」來實現。

有關管道的事情是它只具有有限的緩衝能力。如果一個進程寫入一端而另一進程不讀取,寫入進程最終將被迫停止寫入。或者更確切地說,它會在寫入系統調用中,,等待管道流失。

@ dystroy的回答說,要做到這一點在Java端:

  1. 啓動過程。
  2. 等待過程完成
  3. 讀取過程的輸出。

但是,如果外部進程寫入輸出的地段,它不會能夠來完成,因爲它會被阻塞在寫管道。與此同時,Java方面正在等待外部進程完成,然後開始從管道讀取數據。

死鎖。

+0

當我嘗試顯示C的目錄,與 String [] command2 = {「cmd」,「/ C」,「dir」}; 輸出是可怕的C:\ Windows 如何顯示C的目錄,然後顯示C文件的目錄,然後是php.exe? – Ken

+0

@Ken - 爲php可執行文件使用完整的絕對路徑名。 –

+0

@Ken - 還可以使用exec(String [])方法,這樣就不會遇到exec(String)錯誤地分割命令字符串的問題。 –