Вызов waitFor должен быть после чтения из потоков.
while ((temp = output.readLine()) != null) {
System.out.println(temp);
}
int exitCode = run.waitFor();
Обратите внимание, что если ваш процесс записывает много данных в потоки вывода или ошибки, ваш процесс может не завершиться. В этом случае вам нужно обработать выходной поток в фоновом потоке или заменить Runtime.getRuntime().exec()
, чтобы использовать ProcessBuilder и перенаправить вывод в файлы, которые вы прочитаете позже. Попробуйте этот пример cmds:
String[] cmd = new String[]{"cmd.exe", "/c", "echo", "1"};
String[] cmd = new String[]{"cmd.exe", "/c", "echo", "0"};
String[] cmd = new String[]{"cmd.exe", "/c", "dir", "/s", "C:\\Program Files"};
String[] cmd = new String[]{"cmd.exe", "/c", "dir", "/s", "C:\\Program Files", "1>&2"};
String[] cmd = new String[]{"cmd.exe", "/c", "dirt"};
При звонке:
ProcessBuilder pb = new ProcessBuilder(cmd);
File fileOut = new File("C:\\Temp\\std-output.log");
File fileErr = new File("C:\\Temp\\std-error.log");
pb.redirectError(fileErr);
pb.redirectOutput(fileOut);
Process p = pb.start();
int rc = p.waitFor();
System.out.println("Exit : "+rc);
System.out.println("STDOUT : "+Files.readString(fileOut.toPath()));
System.out.println("STDERR : "+Files.readString(fileErr.toPath()));