2015-10-31 4 views
1

Я хочу, чтобы выполнял Java-CLI-программу из другой Java-программы и получал выход из CLI-программы. Я пробовал две разные реализации (используя runtime.exec() и ProcessBuilder), и они не совсем работают.Выполнение внешнего кода Java и получение вывода

Вот особенная деталь; работы по реализации (catch output) при выполнении команд, таких как pwd, но по какой-то причине они не поймают вывод java-программы Hello World, выполненной с java Hello.

код Исполнение:

public static void executeCommand(String command) 
{ 
    System.out.println("Command: \"" + command + "\""); 

    Runtime runtime = Runtime.getRuntime(); 
    try 
    { 
     Process process = runtime.exec(command); 

     BufferedReader stdInput = new BufferedReader(new 
       InputStreamReader(process.getInputStream())); 

     BufferedReader stdError = new BufferedReader(new 
       InputStreamReader(process.getErrorStream())); 

     // read the output from the command 
     System.out.println("Standard output of the command:\n"); 
     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 

     // read any errors from the attempted command 
     System.out.println("Standard error of the command (if any):\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

Пример вывода

Command: "cd /Users/axelkennedal/Desktop && java Hello" 
Standard output of the command: 

Standard error of the command (if any): 

Command: "pwd" 
Standard output of the command: 

/Users/axelkennedal/Dropbox/Programmering/Java/JavaFX/Kode 
Standard error of the command (if any): 

Я проверил, что Hello действительно напечатать "Привет мир" в CLI при работе Hello непосредственно из командной строки, а не с помощью executeCommand() ,

Привет мир

public class Hello 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello world!"); 
    } 
} 
+0

Выполняет ли Runtime.exec команду через оболочку? Я так не думаю, но ваша команда должна интерпретироваться оболочкой для обработки &&. – blm

+0

Aha! Любая идея о том, как я буду это делать? – Kennedal

+0

Да. Прошло много времени с тех пор, как я использовал Runtime.exec, но я уверен, что он не выполняет синтаксический анализ команд или не вызывает оболочку сначала. Быть 'pwd' - это просто команда без аргументов, она работает, но ваша первая команда имеет аргументы и должна интерпретироваться оболочкой. – blm

ответ

0

Этот "CD/Users/axelkennedal/Desktop & & Java Привет" не одна команда, а две команды, разделенные &&. В общем случае это означает, что первая команда и если первая команда выполняет вторую команду. Вы не можете передать это как одну команду, но вы можете реализовать логику самостоятельно:

, например, для выполнения «cmd1 & & Cmd2»

if (Runtime.getRuntime().exec("cmd1").waitFor() == 0) { 
    Runtime.getRuntime().exec("cmd2").waitFor(); 
} 

Однако, поскольку в этом случае cmd1, чтобы изменить каталоги там это лучший способ, который заключается в использовании функции каталогов ProcessBuilder вместо первой команды.

Process p = new ProcessBuilder("java","hello") 
     .directory(new File("/Users/axelkennedal/Desktop")) 
     .start(); 
+0

Я только что нашел, что в документации, что здорово: D Спасибо! – Kennedal

Смежные вопросы