2011-01-24 3 views
2

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

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

Вы хотите перезаписать старые настройки? [yes, no (default = no)]

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

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

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

Надеюсь, что я выразил достаточно ясный вопрос.

Благодарим за помощь!

ответ

4

Вы должны использовать методы 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(); 
-1

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

0

Это работа для Expect. В Java: , expect4j

+0

У меня были проблемы с Expect before - в том, что вам нужно знать, что именно представляет собой приглашение Shell/DOS, иначе вы не сможете понять, когда пользователь просто нажал [CR], чтобы принять значение по умолчанию , при этом скрипт создает несколько строк. Так как пользователи могут настраивать подсказку, она требует больше усилий для программирования. –

Смежные вопросы