2012-05-23 15 views
13
Process p = Runtime.getRuntime().exec(command); 
    is = p.getInputStream(); 
    byte[] userbytes = new byte[1024]; 
    is.read(userbytes); 

Voglio eseguire un comando di shell in linux os da java. Ma i rapporti di pmd dicono che non usare java Runtime.exec(). Perché? Qual è il motivo ? Esiste un'alternativa per Runtime.exec()?Perché evitare di utilizzare Runtime.exec() in java?

+2

Quale messaggio mostra esattamente pmd? – Tudor

+0

Descrizione del problema: non utilizzare Runtime.exec() per comandi di esecuzione – kannanrbk

+1

Questa è un'affermazione assurda, senza alcun supporto – ControlAltDel

risposta

33

A meno che non si sia bloccati su un'antica JVM, java.lang.ProcessBuilder rende molto più semplice specificare un processo, impostarne l'ambiente, spawnarlo e gestirne i descrittori di file.

Questa classe è utilizzata per creare processi del sistema operativo.

Ogni istanza ProcessBuilder gestisce una raccolta di attributi di processo. Il metodo start() crea una nuova istanza Process con tali attributi. Il metodo start() può essere richiamato ripetutamente dalla stessa istanza per creare nuovi sottoprocessi con attributi identici o correlati.

...

Avvio di un nuovo processo che utilizza la directory predefinita e dell'ambiente di lavoro è semplice:

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

Ecco un esempio che avvia un processo con una directory di lavoro modificato e l'ambiente:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
Process p = pb.start(); 
+1

Grazie Mike. ProcessBuilder ha funzionato perfettamente nel mio caso. Molto più facile che con Runtime.exec(). Maggiori informazioni ed esempi su http://docs.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html – tremendows

Problemi correlati