Java Runtime.getRuntime(): getting output from executing a command line program
Java Runtime.getRuntime(): получение выходных данных при выполнении программы из командной строки
Я использую среду выполнения для запуска команд командной строки из моей Java-программы. Однако я не знаю, как я могу получить выходные данные, которые возвращает команда.
Я пытался сделать System.out.println(proc); но это ничего не вернуло. Выполнение этой команды должно вернуть два числа, разделенные точкой с запятой. Как я мог бы получить это в переменной для распечатки?
// Read the output from the command System.out.println("Here is the standard output of the command:\n"); Strings=null; while ((s = stdInput.readLine()) != null) { System.out.println(s); }
// Read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); }
Прочитайте Javadoc для получения более подробной информации здесь. ProcessBuilder было бы хорошим выбором для использования.
На момент написания этой статьи все другие ответы, включающие код, могут привести к взаимоблокировкам.
Процессы имеют ограниченный буфер для stdout и stderr выходных данных. Если вы не будете прослушивать их одновременно, один из них заполнится, пока вы пытаетесь прочитать другой. Например, вы могли ожидать чтения из stdout в то время как процесс ожидает записи в stderr. Вы не можете читать из stdout буфера, потому что он пуст, и процесс не может выполнять запись в stderr буфер, потому что он заполнен. Вы вечно ждете друг друга.
Вот возможный способ считывания выходных данных процесса без риска взаимоблокировок:
Ключ в том, чтобы использовать ProcessBuilder.redirectErrorStream(true) который перенаправит stderr в stdout поток. Это позволяет вам читать один поток без необходимости чередовать stdout и stderr. Если вы хотите реализовать это вручную, вам придется использовать потоки в двух разных потоках, чтобы убедиться, что вы никогда не заблокируете.