2009-04-27 31 views
30

Java'da ucuz ve yerel sistem komutunu (uname -a) çalıştırmaya çalışıyorum. uname çıktısını alıp bir String içine saklamak istiyorum. Bunu yapmanın en iyi yolu nedir? Güncel kodu:Java kullanarak sistem komutları (linux/bsd) nasıl çalıştırılır

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."); 
    } 
} 

cevap

53

Yolunuz muhtemelen ne yaparım den uzakta değildir: Eğer tabii ki, ister hangisi istisnalar

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(); 

Kol.

+2

“b.Close()” ifadesini 'b.close()' olarak değiştirmeyi düşünür müsünüz? Onu düzenlerdim, ama "en az altı" karakteri değiştirmem gerekiyor. (Düzenlemeleriniz bu şekilde kısıtlanmadığı sürece) –

+1

@AndrewBreksa: done! yazım hatası için teşekkürler :) –

+1

'Sorun yok. :) –

2

Yaptığınız şey iyi görünüyor. Komutunuz sadece tek bir dize döndürüyorsa, while döngüsüne ihtiyacınız yoktur, sadece bir String değişkeninde reader.readLine() değerini saklayın. Ayrıca, bunları yutmak yerine, muhtemelen bu istisnalarla bir şeyler yapmalısınız.

+0

Evet, döngüye ihtiyacım yok mu? Mükemmel teşekkürler! –

7

Bunu yapmanın en iyi yolu budur. Ayrıca değişken argüman yapıcı sahiptir ProcessBuilder kullanabilirsiniz, böylece bir çizgi veya kod ikisini kurtarabilecek

+0

Komut, kabuk kullanılarak çalıştırıldığı için * en iyi * yol değildir ve sonuçta, komut argümanları kullanıcı girdisinden alınırsa, OS komutu enjeksiyonuna hassastır. 'ProcessBuilder' bu açıdan kesinlikle daha güvenlidir. – kravietz

+0

"Ucuz olmaya ve yerel bir sistem komutunu çalıştırmaya çalışıyorum (uname -a) ..." - ucuz olmanın ve yerel bir sistem komutunu yürütmenin EN İYİ yolu. Size atıfta bulunulan şey, OS komutunun enjeksiyonuna izin vermemek için en iyi yoldur;) – Azder

+2

Biliyorsunuz, bir programcıdan uçurumun en hızlı * yolu için sormak gibi bir şey ... :) OS komutları enjeksiyonları StackOverflow-ilhamlı bir yürütme desenini kullanan Java uygulamaları, bu yüzden Runtime.exec() 'den bahseden herhangi bir şeyin burada büyük, şişman bir uyarıyı hak ettiğini düşünüyorum. – kravietz

İlgili konular