Я выполняю процесс cmd в собственных окнах из моей программы на Java.Я хочу иметь возможность просматривать вход и выход разветвленного процесса.Тем не менее, мне кажется, что я ничего не могу написать в нее из программы Java.
Когда я пытаюсь записать набор символов в командную строку в Windows, я ожидаю, что этораспечатать что-нибудь на экране - что угодно.Итак, если я дам ему бессмысленный мусор, то он должен напечатать, что он не понимает эту команду.
Однако после записи моей строки мусора в OutputStream дочернего процесса в следующем коде:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
PrintWriter out = new PrintWriter(process.getOutputStream());
String line = null;
out.println("My Garbage String");
while((line = readLine()) != null)
System.out.println(line);
программа останавливается там, где она говорит: while((line = readLine()) != null)
.
Итак, родительский процесс, очевидно, блокируется, пока дочерний процесс не получает некоторый ввод, не разблокирует и не отправляет этот ввод в родительский процесс.Но я даю дочернему процессу некоторый ввод, когда я что-то записываю в метод PrintWriter
println()
, не так ли?
ОБНОВЛЕНИЕ
Теперь, из-за некоторых ответов, которые мне дали, я решил уточнить, в чем заключается моя проблема.Я могу прочитать вывод из командной строки в порядке.Фактически, когда я впервые запускаю его, я получаю все те же выходные данные, которые вы обычно получаете, если вы наберете «cmd» в командной строке.
Например, возьмем следующий пример кода:
Process process = Runtime.getRuntime().exec("cmd");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
PrintWriter out = new PrintWriter(process.getOutputStream());
String line = null;
do
{
line = in.readLine();
System.out.println(line);
}while(line!=null)
Вывод кода будет следующим:
Microsoft Windows XP [Версия 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp.
Как видите, командная строка выводит мой родительский процесс на вывод.Но, запустив это в режиме отладки в моей IDE, я обнаружил, что он просто останавливается на строке line=in.readLine();
.Таким образом, дочерний процесс блокируется, потому что больше нечего печатать.
Итак, когда я пытаюсь дать ему какой-то ввод, используя его свойство OutputStream
, он не отвечает.Вместо этого программа блокируется там, где line=in.readLine();
.
В ответ на то, что предложил один из авторов, упомянутая вами статья ( Когда Runtime.exec () не будет ), он только переходит к получению выходных данных из OutputStream
и ErrorStream
свойства.Здесь не упоминается, как я могу дать ему какой-либо ввод, кроме начальных параметров выполнения, которые задаются в виде массива при запуске Runtime.exec(args)
.
Для имитации того, что я хотел сделать изначально (т.е. дать ему случайный мусор и распечатать, что он не понимает команду), я мог бы просто набрать Runtime.getRumtime().exec("cmd /c random garbage);
в моем коде и запустить его.Но это не то, что я хочу сделать.Я хочу общаться с командной строкой после того, как она уже начала свое выполнение.
В конечном счете, я хочу иметь возможность взаимодействовать с другой программой, которая обычно требует взаимодействия с ними после выполнения из программы Java.Тем не менее, если я могу сказать ему, что делать, только когда я укажу параметры его выполнения, то я не смогу взаимодействовать с отдельным процессом с использованием Java так, как я хочу.
Если кто-нибудь знает, как этого можно достичь, скажите, пожалуйста.Спасибо.