从Java调用“交互式”Perl脚本

我想从Java程序中调用“交互式”Perl脚本。 只是为了清晰起见,反过来(从Perl到Java)对我来说并不好。

该脚本是交互式的,因为它需要与用户进行小型配置对话。 例如,在cmd.exe中调用脚本会导致如下对话框:

要覆盖旧设置吗? [是,否(默认=否)]

并且用户应该在命令行中选择是,否或根本不写。 根据用户的选择,会出现另一条消息:“你想……”,用户会回复等等。我想你已经得到了图片。

我的问题是,当在Java程序中调用脚本时,如何与用户进行相同的对话? 我的意思是,如何将脚本的问题捕获给用户,向用户显示,然后将用户的答案(在Java程序中获取)发送到脚本?

在这种情况下,一个简单的Runtime.getRuntime()。exec()不起作用。

希望我能够表达清楚的问题。

感谢您的帮助!

您必须使用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(); 

这是Expect的工作。 在Java中: ExpectJ , expect4j

如果(1)您的调用是从Java到Perl,以及(2)您没有解析Perl脚本本身,为什么不使用Java代码中的JOptionPane.showConfirmDialog()? 如果从脚本中获得“是/否”,那应该不是什么大问题。 无论您要打印到用户显示什么,都可以作为纯ASCII文本包含在该确认对话框中。