【问题标题】:Call "interactive" Perl script from Java从 Java 调用“交互式”Perl 脚本
【发布时间】:2011-01-25 15:05:53
【问题描述】:

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

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

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

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

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: java perl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是Expect 的工作。在 Java 中:ExpectJexpect4j

      【讨论】:

      • 我以前遇到过Expect的问题——你需要知道Shell/DOS提示符到底是什么,否则你无法弄清楚用户何时点击[CR]接受默认值,脚本产生多行。由于用户可以自定义提示,因此对我来说似乎需要更多的编程工作。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多