Я использую среду выполнения для запуска команд командной строки из моей программы Java. Тем не менее, я не знаю, как получить результат, который возвращает команда.
Вот мой код:
Runtime rt = Runtime.getRuntime();
String[] commands = {"system.exe", "-send" , argument};
Process proc = rt.exec(commands);
Я пытался сделать, System.out.println(proc);
но это ничего не вернуло. Выполнение этой команды должно вернуть два числа, разделенных точкой с запятой. Как я могу получить это в переменной для печати?
Вот код, который я использую сейчас:
String[] commands = {"system.exe", "-get t"};
Process proc = rt.exec(commands);
InputStream stdIn = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdIn);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ((line = br.readLine()) != null)
System.out.println(line);
System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
Но я ничего не получаю в качестве вывода, но когда я сам запускаю эту команду, она работает нормально.
pwd && ls
не просто выполняет один файл, когда вы делаете это в оболочке, он выполняет/bin/pwd
и/bin/ls
исполняемые файлы, и. Если вы хотите делать что-то подобное в Java, вам нужно сделать что-то вроде{"/bin/bash","-c", "pwd && ls"}
. У вас, вероятно, больше нет вопроса, но другие люди могут, поэтому я подумал, что могу ответить на него.stdout
иstderr
вывода. Если вы не слушаете их одновременно, один из них заполнится, а вы читаете другой. Программа, которую вы слушаете, затем заблокирует попытку записи в заполненный буфер, в то время как на другом конце ваша программа заблокирует попытку чтения из буфера, который никогда не вернетсяEOF
. Вы должны читать из обоих потоков одновременно.Более быстрый способ это:
Который в основном является сжатой версией этого:
Я знаю, что этот вопрос старый, но я публикую этот ответ, потому что я думаю, что это может быть быстрее.
источник
\A
в регулярном выражении означает начало строки, и мне пришлось избежать косой черты.Помимо использования,
ProcessBuilder
как предложено Senthil, обязательно прочитайте и выполните все рекомендации, когда Runtime.exec () не будет .источник
ProcessBuilder
как сейчас рекомендуется дважды. Используя aProcessBuilder
, можно объединить потоки вывода и ошибок, чтобы упростить их использование одновременно.Если вы уже используете Apache commons-io на classpath, вы можете использовать:
источник
Также мы можем использовать потоки для получения вывода команды:
источник
@Senthil и @Arend answer ( https://stackoverflow.com/a/5711150/2268559 ) упомянуты
ProcessBuilder
. Вот пример использованияProcessBuilder
с указанием переменных среды и рабочей папки для команды:источник
На момент написания этой статьи все остальные ответы, содержащие код, могут привести к взаимоблокировке.
Процессы имеют ограниченный буфер для
stdout
иstderr
вывода. Если вы не слушаете их одновременно, один из них заполнится, пока вы пытаетесь читать другой. Например, вы можете ожидать чтения,stdout
пока процесс ожидает записиstderr
. Вы не можете прочитать изstdout
буфера, потому что он пуст, а процесс не может записать вstderr
буфер, потому что он полон. Вы каждый ждете друг друга вечно.Вот возможный способ прочитать выходные данные процесса без риска взаимоблокировок:
Ключ должен использовать
ProcessBuilder.redirectErrorStream(true)
который будет перенаправлятьstderr
вstdout
поток. Это позволяет читать один поток без необходимости чередоватьstdout
иstderr
. Если вы хотите реализовать это вручную, вам придется использовать потоки в двух разных потоках, чтобы никогда не блокировать их.источник
Если вы пишете на Kotlin, вы можете использовать:
источник
Адаптировано из предыдущего ответа:
источник
Практически так же, как и другие фрагменты на этой странице, но просто упорядочиваем вещи по функциям , здесь мы идем ...
Функция класса:
источник
Попробуйте прочитать
InputStream
из среды выполнения:Вам также может понадобиться прочитать поток ошибок (
proc.getErrorStream()
), если процесс печатает вывод ошибок. Вы можете перенаправить поток ошибок в поток ввода, если вы используетеProcessBuilder
.источник