Вызвать «интерактивный» Perl-скрипт из Java - PullRequest
2 голосов
/ 24 января 2011

Я хочу вызвать «интерактивный» скрипт Perl из Java-программы.Просто для ясности, наоборот (от Perl до Java) мне не подходит.

Сценарий является интерактивным в том смысле, что он требует небольшого диалога настройки с пользователем.Например, вызов сценария в cmd.exe приведет к появлению диалогового окна, подобного следующему:

Хотите перезаписать старые настройки?[да, нет (по умолчанию = нет)]

, и пользователь должен выбрать между написанием да, нет или вообще ничего в командной строке.И в зависимости от выбора пользователя может появиться другое сообщение: «Вы хотите…», и пользователь ответит и т. Д. И т. Д. Я думаю, что вы получили изображение.

Мой вопрос: как я могу получитьтот же диалог с пользователем, когда скрипт вызывается в программе Java?Я имею в виду, как я могу записать вопросы сценария пользователю, показать их пользователю и затем отправить ответ пользователя (полученный в программе Java) сценарию?

Простой Runtime.getRuntime (). Exec.() не работает в этом случае.

Надеюсь, я достаточно ясно сформулировал вопрос.

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 24 января 2011

Вы должны использовать методы getInputStream / getOutputStream, чтобы получить доступ к stdin и stdout perl stript.Вы можете читать и писать в эти потоки, чтобы имитировать поведение пользователя

OutputStream stdin = null;
InputStream stderr = null;
InputStream stdout = null;
Process process = Runtime.getRuntime ().exec ("...");
stdin = process.getOutputStream ();
stderr = process.getErrorStream ();
stdout = process.getInputStream ();
// "write" the parms into stdin
String line = "data\n";   
stdin.write(line.getBytes());
stdin.flush();
stdin.close();
// clean up if any output in stdout
BufferedReader brCleanUp = 
  new BufferedReader (new InputStreamReader (stdout));
while ((line = brCleanUp.readLine ()) != null) {
  //System.out.println ("[Stdout] " + line);
}
brCleanUp.close();

// clean up if any output in stderr
brCleanUp = 
  new BufferedReader (new InputStreamReader (stderr));
while ((line = brCleanUp.readLine ()) != null) {
  //System.out.println ("[Stderr] " + line);
}
brCleanUp.close();
0 голосов
/ 25 января 2011

Это работа для Ожидайте .В Java: ExpectJ , Ожидаем4j

0 голосов
/ 24 января 2011

Если (1) ваш вызов из Java в Perl, и (2) вы не анализируете сам скрипт Perl, почему бы не использовать JOptionPane.showConfirmDialog () из кода Java?Не должно быть большой проблемы, если все, что вы получаете от сценария - это да / нет.Все, что вы печатаете для отображения пользователю, также может быть включено в этот диалог подтверждения в виде простого текста ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...