2011-11-07 59 views
0

當我應用命令命令我沒有得到任何輸出。如何在使用命令時獲得輸出或不是兩種情況?如何獲得管道命令也返回Java exec中的輸出?

public class test 
{ 

    public static void main(String args[]) 
    { 
    System.out.println(
     systemtest("ifconfig | awk 'BEGIN { FS = \"\n\"; RS = \"\" } { print $1 $2 }' | sed -e 's/ .*inet addr:/,/' -e 's/ .*//'")); 

    } 

    public static String systemtest(String cmds) 
    { 
    String value = ""; 
    try 
    { 
     String cmd[] = { 
     "/bin/sh", 
     "-c", 
     cmds 
     };  
     Process p=Runtime.getRuntime().exec(cmd); 
     // Try 0: here? wrong 
     //p.waitFor(); 
     BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line=reader.readLine(); 
     // Try 1: here? 
     //p.waitFor(); 
     while(line!=null) 
     { 
     value += line + "\n"; 
     line=reader.readLine(); 
     } 
     // Try 2: here? 
     p.waitFor(); 
    } catch(IOException e1) { 

    } catch(InterruptedException e2) { 

    } 

    return value; 
    } 

回答

1

您需要在之前讀取命令的輸出,您可以撥打p.waitFor()

事實:從外部命令

  • 輸出經由操作系統級「管道」遞送。
  • 管道的緩衝量有限。
  • 如果某個生產者進程嘗試寫入「滿」的管道,則進程將被迫等待,直到消費者進程從管道讀取一些數據。

從上面的事實中不難看出,應用程序的寫入方式會導致死鎖,如果外部應用程序產生的輸出超過管道緩衝區的輸出量(O/S空間)。

(即使這不是你的問題這一次的真正原因,它可以讀取/寫入外部進程的時候是其他時間。當心死鎖。)

+0

p.waitFor();我在while循環或before while循環之後在最後一行中改變了這個。但結果是一樣的。我還沒有得到輸出,但是一旦我調用systemtest(「ifconfig」);它總是輸出。 – YumYumYum

+0

編輯我嘗試的命令:ifconfig | awk'BEGIN {FS = \「\ n \」; RS = \「\」} {print $ 1 $ 2}'| sed -e's /。* inet addr:/,/'-e's /。* //' – YumYumYum

+1

嘗試一些簡單的方法,比如'systemtest(「ifconfig | cat」)''。我有一種感覺,問題是反斜槓。正如所寫的,你在一個shell命令中看起來非法的地方有一個ASCII換行符。我現在在Windows上,所以我不能輕易檢查這個... –

1

您需要了解如何處理stdout,stderr和流管道。 另外,你可能有興趣看看Commons ExecCommons CLI 我希望它會幫助你。 祝你好運!

+1

共享CLI也無濟於事,因爲這是一個用於解析命令行的庫。不支持生成命令行或進程處理。 –

+0

@ A.H。我沒有認識到問題與您的評論之間的關聯。請解釋。 – aviad

+0

問題是關於:「我怎樣才能*執行一個程序」。 Commons CLI是關於「當我*實現*一個程序時,我如何解析命令行。」 –

相關問題