2011-05-30 34 views
0

我試圖從Java運行命令行命令,並且快速完整性檢查讓我意識到我遇到問題的原因是我無法獲得以下pr.waitFor()調用的工作。該程序在30秒內結束,並在「foo:」後面打印任何內容。我預計它只需要超過30秒,然後在「foo:」後打印一個隨機數字。我究竟做錯了什麼?如何使用javas Process.waitFor()?

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class Sample { 

    public static void main(String[] args) throws Exception { 
     Runtime rt = Runtime.getRuntime(); 
     Process pr = rt.exec("sleep 32; echo $RANDOM"); 
     pr.waitFor(); 

     BufferedReader input = new BufferedReader(
            new InputStreamReader(pr.getInputStream())); 
     String line=null; 

     StringBuilder s = new StringBuilder(); 
     while((line=input.readLine()) != null) { 
      System.out.println(s); 
      s.append(line); 
     } 
     System.out.println("foo: " + s.toString()); 
    } 
} 

回答

2

你應該試試這個:

Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" }); 

這將啓動一個shell進程,然後內殼運行你的命令。直到命令完成後,shell纔會返回。

讓我知道,如果這對你有用。

0

您正試圖執行shell命令。你應該嘗試執行一個程序。

如Femi的答案中所示,您可以調用bash作爲可執行文件,然後傳遞給它將使bash執行sleep和echo命令的參數。

+0

嗯,你能不能請延長你的答案有點?我怎麼做?另外,sleep和echo是shell命令,它們不是嗎? – jonalv 2011-05-30 15:00:23

+0

@jonalv確定我會編輯它。基本上exec不調用shell,它調用一個可執行文件。如果你想執行shell命令,你需要調用shell並傳遞要執行的命令。 Femi的答案顯示瞭如何調用shell bash並執行睡眠和回顯。 – ditkin 2011-05-30 15:04:24

2

Process.waitFor()阻塞當前線程,直到進程終止,此時執行控制返回到產生進程的線程。

在發佈的代碼中,一旦進程終止(即在Process.waitFor調用之後),現在終止的進程的輸入流不再有任何可讀取的數據。因此,讀取流的內容並將其打印出來,將不會產生任何實際的輸入。

如果您需要讀取流的內容,您需要生成一個新的線程,該線程將負責在子進程之前根據需要讀取輸入流並寫入輸出流的必要活動終止。

或者您可以在同一個線程中執行讀寫操作,但在等待子進程終止之前執行。換句話說,您需要切換包含pr.waitFor();的行的順序和從InputStream讀取的行。在SO

相關問題:

  1. Process.waitFor(), threads, and InputStreams
相關問題