Я хочу, чтобы выполнял 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!");
}
}
Выполняет ли Runtime.exec команду через оболочку? Я так не думаю, но ваша команда должна интерпретироваться оболочкой для обработки &&. – blm
Aha! Любая идея о том, как я буду это делать? – Kennedal
Да. Прошло много времени с тех пор, как я использовал Runtime.exec, но я уверен, что он не выполняет синтаксический анализ команд или не вызывает оболочку сначала. Быть 'pwd' - это просто команда без аргументов, она работает, но ваша первая команда имеет аргументы и должна интерпретироваться оболочкой. – blm