gpt4 book ai didi

java - 以交互方式从 java 代码调用 perl 脚本

转载 作者:行者123 更新时间:2023-11-30 05:05:40 26 4
gpt4 key购买 nike

有人可以在以下情况下帮助我吗

我需要从我的 java 代码中调用 perl 脚本。 perl脚本是一个交互式代码,它在执行过程中获取用户的输入并继续执行直至结束。因此,我使用的示例是,当用户输入某个值(例如“26”)时,perl 脚本在执行时会通过在控制台中打印“你多大了?”来询问年龄。然后它会打印“哇!你已经 26 岁了!”。

当我尝试从 java 代码调用此脚本时,该过程会等待,直到我在输出流中给出值 26,而在输入流中没有值。最后,当我再次读取输入流时,我得到了脚本的整个输出。那么,我不能让它互动吗?

我浏览了很多论坛和博客,但找不到任何一个完全符合我的要求。

这是java代码

import java.io.*;

public class InvokePerlScript {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Process process;

try
{
process = Runtime.getRuntime().exec("cmd /c perl D:\\sudarsan\\eclips~1\\FirstProject\\Command.pl");

try {
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}

try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
out.write("23");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}

process.waitFor();
if(process.exitValue() == 0)
{
System.out.println("Command Successful");
try {
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
System.out.println("Command Failure");
try {
BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
catch(Exception e)
{
System.out.println("Exception: "+ e.toString());
}
}

}

Perl代码如下

$| = 1;
print "How old are you? \n";
$age = <>;
print "WOW! You are $age years old!";

提前致谢,苏达桑

最佳答案

写入值后,您是否在 Java 中的 OutputStream 上调用 flush() ?如果不这样做,它们很可能只会保存在 Java 进程内的流缓冲区中,因此永远不会到达 Perl(结果是两个进程最终都会等待对方的 IO。)

(根据流的实现,这可能是必要的,也可能不是必要的,但这肯定不会造成伤害 - 我过去就被这个问题困扰过。通常不需要那么小心,因为刷新是在调用 close() 时隐式发生的,但在这里您无法在完成写入后关闭流。)

关于java - 以交互方式从 java 代码调用 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com