2009-04-27 12 views
30

Sto tentando di essere a buon mercato e di eseguire un comando di sistema locale (uname -a) in Java. Sto cercando di prendere l'output da uname e memorizzarlo in una stringa. Qual è il modo migliore per fare questo? Codice attuale:Come eseguire comandi di sistema (linux/bsd) utilizzando Java

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

risposta

53

Il tuo modo non è lontano da quello che probabilmente farei:

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

maniglia a seconda di quale delle eccezioni si cura di, ovviamente.

+2

Ti dispiacerebbe cambiare il 'b.Close()' a 'b.close()'? Lo modifico, ma ho bisogno di cambiare "almeno sei" caratteri. (A meno che le tue modifiche non siano limitate in questo modo) –

+1

@AndrewBreksa: done! grazie per aver trovato l'errore :) –

+1

'Nessun problema. :) –

2

Quello che stai facendo sembra a posto. Se il comando restituisce solo una singola stringa, non è necessario il ciclo while, è sufficiente memorizzare il valore reader.readLine() in una singola variabile String.

Inoltre, probabilmente dovresti fare qualcosa con quelle eccezioni, piuttosto che inglobarle.

+0

Sì, non ho bisogno del ciclo giusto? Perfetto grazie! –

7

Questo è il modo migliore per farlo. Inoltre è possibile utilizzare il ProcessBuilder, che ha un costruttore di argomenti variabili, così da poter salvare una o due righe di codice

+0

Non è il modo * migliore * dal momento che il comando viene eseguito tramite shell e, di conseguenza, è suscettibile all'input del comando OS se gli argomenti del comando vengono presi dall'input dell'utente. 'ProcessBuilder' è sicuramente più sicuro in questo aspetto. – kravietz

+0

"Sto cercando di essere economico ed eseguo un comando di sistema locale (uname -a) ..." - è il modo migliore per essere economico ed eseguire un comando di sistema locale. Quello a cui ti riferisci è il modo migliore per essere insensibile all'iniezione del comando OS;) – Azder

+2

Sai, è un po 'come chiedere a un programmatore il modo * più veloce * lungo la scogliera ... :) Ho trovato iniezioni di comandi OS in un Applicazioni Java che utilizzano un pattern di esecuzione ispirato a StackOverflow, quindi penso che tutto ciò che menziona Runtime.exec() meriti qui un grosso avvertimento. – kravietz

Problemi correlati