2011-01-24 119 views
2

我想從Java程序調用「交互式」Perl腳本。爲了清楚起見,反過來(從Perl到Java)對我來說並不好。從Java調用「交互式」Perl腳本

該腳本是交互式的,因爲它需要一個與用戶的小配置對話框。例如,在cmd.exe中調用腳本會導致如下對話框:

是否要覆蓋舊的設置? [是,否(默認=否)]

用戶應該選擇在命令行中寫入yes,no還是nothing。 並根據用戶選擇另一個消息會出現:「你想......」和用戶會迴應等等等等。我認爲你得到了圖片。

我的問題是如何在Java程序中調用腳本時與用戶有同樣的對話框?我的意思是,如何將腳本的問題捕獲給用戶,向用戶展示,然後將用戶的答案(獲得Java程序)發送給腳本?

在這種情況下,一個簡單的Runtime.getRuntime().exec()不起作用。

希望我明確表達了這個問題。

謝謝你的幫助!

回答

4

您必須使用getInputStream/getOutputStream方法來訪問perl stript的stdin和stdout。您可以讀取和寫入這些流來模擬用戶的行爲

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:ExpectJexpect4j

+0

我已經與之前預計的問題 - 在你需要知道究竟是殼牌/ DOS提示符下,否則你無法弄清楚當用戶只需點擊[CR]接受默認,劇本產生多行。由於用戶可以自定義提示,所以我喜歡更多的編程工作。 – 2011-01-25 16:29:32