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

Chcę wykonać polecenie powłoki w systemie Linux z java. Ale raporty pmd mówią: nie używaj java Runtime.exec(). Czemu? Jaki jest powód ? Czy istnieje alternatywa dla Runtime.exec()?Dlaczego należy unikać Runtime.exec() w java?

+2

Co to jest komunikat pmd pokazujący dokładnie? – Tudor

+0

Opis problemu: Nie używaj Runtime.exec() do wykonywania poleceń – kannanrbk

+1

To jest absurdalne stwierdzenie, bez absolutnie żadnego zabezpieczenia. – ControlAltDel

Odpowiedz

33

Jeśli nie utknąłeś na starożytnej maszynie JVM, java.lang.ProcessBuilder znacznie ułatwia określenie procesu, ustawienie jego środowiska, odrodzenie i obsługę deskryptorów plików.

Ta klasa służy do tworzenia procesów systemu operacyjnego.

Każda instancja ProcessBuilder zarządza zbiorem atrybutów procesu. Metoda start() tworzy nową instancję Process z tymi atrybutami. Metoda start() może być wielokrotnie wywoływana z tej samej instancji w celu utworzenia nowego podprocesu o identycznych lub pokrewnych atrybutach.

...

Rozpoczęcie nowego procesu, który używa domyślnego katalogu i środowiska pracy jest łatwe:

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

Oto przykład, który uruchamia proces z katalogu zmodyfikowany pracy i środowiska:

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

Dzięki Mike. ProcessBuilder działał doskonale w moim przypadku. Znacznie łatwiej niż w Runtime.exec(). Więcej informacji i przykład na http://docs.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html – tremendows

Powiązane problemy