Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用;互动式;来自Java的Perl脚本_Java_Perl - Fatal编程技术网

调用;互动式;来自Java的Perl脚本

调用;互动式;来自Java的Perl脚本,java,perl,Java,Perl,我想从Java程序调用一个“交互式”Perl脚本。为了清楚起见,另一种方法(从Perl到Java)对我来说并不好 脚本是交互式的,因为它需要与用户进行一个小的配置对话框。例如,在cmd.exe中调用脚本将导致如下对话框: 是否要覆盖旧设置?[是,否(默认值=否)] 用户应该在命令行中选择是、否或什么都不写。 根据用户的选择,会出现另一条消息:“你想……吗?”用户会回答等等。我想你已经明白了 我的问题是,在Java程序中调用脚本时,如何与用户进行相同的对话?我的意思是,我如何才能捕获脚本的问题给用

我想从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();

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

这是一个用户的作业。在Java:,

中,我以前遇到过Expect的问题,因为您需要知道Shell/DOS提示符的确切内容,否则您无法确定用户何时点击[CR]接受默认值,脚本会产生多行。因为用户可以自定义提示,所以对我来说,它似乎需要更多的编程工作。