Как получить вывод командной строки в java?
Как получить вывод командной строки, что означает, что я имею приглашение командной строки, подобное этому.
Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe /K \"C:\\Editor\\editorTemp.exe\"");
Я не могу получить вывод cmd следующим образом
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
Итак, как я могу получить вывод командной строки?
Ответы
Ответ 1
Это не вопрос Java. В основном, что вы делаете, работает Java (Java Main Process A), и от него начинается другой процесс (Windows CMD B). Это нормально, и вы можете получать потоки ввода/вывода этого процесса (B) в Java (A).
Однако этот процесс (B) запускает другой процесс (опять же Windows CMD C) со своим собственным стандартным вводом/выводом. Этот процесс не имеет ничего общего с процессами A & B и использует стандартные потоки ввода/вывода Windows. Таким образом, между A и C. нет связей.
Я не уверен, но я думаю, что есть несколько способов запуска Windows CMD с разными или не стандартными ввода-выводами. Возможно, что-то вроде этого будет работать:
cmd <tty >tty
но в Windows нет tty. Прагматически вы можете сделать это, как описано здесь - Создание дочернего процесса с перенаправленными вводами и выводами, но это не сработает для обычного CMD.
Тем не менее, это стало еще более проблематичным, когда вы запускаете свой собственный процесс из редактораTemp.exe(процесс D). D еще больше отключается от процесса А. И все для чего? Что вы не просто начинаете с процесса D непосредственно из A и имеете полный контроль над потоками ввода-вывода и самим процессом?
Вот хороший пример, как это сделать.
Ответ 2
Ваш поток java работает независимо от вызова CMD. Код java разбивает трубку STDOUT
, прежде чем что-либо будет записано.
Если вы вызываете Process.waitFor()
, он будет ждать завершения вызова CMD. STDOUT
должен быть в буфере, а затем вы можете его прочитать.
Ответ 3
Когда вы выполняете readLine(), ваш поток Java блокируется до тех пор, пока у вас не будет фактической полной строки или входной поток не будет закрыт.
Если программа печатает частичную строку (без CR или LF в конце), а затем ждет ввода, readLine будет застревать.
Итак, вам нужно будет прочитать персонаж по персонажам, пока вы не подумаете, что в процессах больше нечего сказать.
См. Можно ли читать из InputStream с таймаутом?