Как получить вывод командной строки в 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 с таймаутом?