2009-04-27 7 views
30

Javaで安価でローカルシステムコマンド(uname -a)を実行しようとしています。私はunameからの出力をつかみ、それをストリングに格納しようとしています。これを行う最善の方法は何ですか?現在のコード:Javaを使用してシステムコマンド(linux/bsd)を実行する方法

public class lame { 

    public static void main(String args[]) { 
     try { 
      Process p = Runtime.getRuntime().exec("uname -a"); 
      p.waitFor(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line=reader.readLine(); 

      while (line != null) {  
       System.out.println(line); 
       line = reader.readLine(); 
      } 

     } 
     catch(IOException e1) {} 
     catch(InterruptedException e2) {} 

     System.out.println("finished."); 
    } 
} 

答えて

53

あなたのやり方は、私はおそらくであろうことから、遠くではありません:あなたはもちろん、気にいずれかの例外を除い

Runtime r = Runtime.getRuntime(); 
Process p = r.exec("uname -a"); 
p.waitFor(); 
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line = ""; 

while ((line = b.readLine()) != null) { 
    System.out.println(line); 
} 

b.close(); 

ハンドル。

+2

'b.Close()'を 'b.close()'に変更してもよろしいですか?私はそれを編集するだろうが、私は "少なくとも6つの文字を変更する必要があります。 (あなたの編集がそのように制限されていない限り) –

+1

@AndrewBreksa:done!タイプミスをキャッチしてくれてありがとう:) –

+1

'問題ありません。 :) –

2

あなたは何をしているようです。あなたのコマンドが単一の文字列を返すだけの場合、whileループは必要ありません。ただひとつのString変数にreader.readLine()値を格納してください。

また、例外を飲み込むのではなく、例外を実行する必要があります。

+0

ええ、私はループ右が必要ないのですか?完璧なおかげで! –

7

それを行う最良の方法です。 はまた、あなたは、可変引数のコンストラクタを持っているProcessBuilderを使用することができますので、あなたは、行または2つのコードを救うことができる

+0

コマンドがシェルを使用して実行されているので、*ベスト*方法ではありません。その結果、コマンド引数がユーザー入力から取得された場合、OSコマンド注入の影響を受けます。 'ProcessBuilder'は確実にこの面で安全です。 – kravietz

+0

"安価でローカルシステムコマンド(uname -a)を実行しようとしています..." - 安価でローカルシステムコマンドを実行するための最良の方法です。あなたが参照しているのは、OSコマンドインジェクションにUNが受け入れられない最良の方法です) – Azder

+2

あなたが知っているのは、プログラマに崖の下で最速の方法を尋ねるようなものです。 Javaアプリケーションは、StackOverflowからインスピレーションを受けた実行パターンを使用しているので、Runtime.exec()には大きな警告が必要です。 – kravietz

関連する問題