Процесс командной строки не получает ничего от стандартного ввода - PullRequest
0 голосов
/ 21 июня 2011

У меня есть приложение командной строки, которое ожидает нажатия клавиши для выхода. Процесс запускается нормально с Java, но когда я посылаю нажатие клавиши (а), ничего не происходит. Похоже, что приложение никогда не получает ничего от стандартного ввода. Вот пример кода:

Process p = Runtime.getRuntime().exec("\"C:\\app.exe\"");
Thread.sleep(5000);
OutputStream out = p.getOutputStream();
out.write(97);
out.flush();
out.close();
p.waitFor();

Работает нормально, если я просто запускаю его из командной строки. Кто-нибудь знает, в чем может быть проблема?

Спасибо!

1 Ответ

2 голосов
/ 21 июня 2011

Вам нужно прочитать оба потока, getInputStream и getErrorStream, иначе ваша программа может блокироваться навсегда, см. JavaDoc

Методы, которые создают процессы, могут не работать должным образом для специальных процессов на определенных собственных платформах, таких как собственные процессы управления окнами, процессы-демоны, процессы Win16 / DOS в Microsoft Windows или сценарии оболочки. Созданный подпроцесс не имеет собственного терминала или консоли. Все его стандартные операции io (т.е. stdin, stdout, stderr) будут перенаправлены на родительский процесс через три потока (getOutputStream (), getInputStream (), getErrorStream ()). Родительский процесс использует эти потоки для подачи входных данных и получения выходных данных из подпроцесса. Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже к тупиковой ситуации.

...