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

标签 java perl integration

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

我需要从我的 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/

相关文章:

java - 运行时未找到方面

xml - 如何使用 XML::Twig 获取内容?

linux - Linux 模拟器 "Cannot execute binary"错误

perl - 删除 ClearCase View 脚本

c++ - 将用 C 编写的程序与用 C++ 编写的另一个程序集成

facebook - Codeigniter 集成 Facebook API PHP SDK 3

java - Android ListView - onItemClickListener

java - 当标签内有 &lt;!--> 时,无法使用文本定位元素

java - 使用 Commons 或 Guava 将文本文件放入 Java List<String>

python - 如何在Python中求矩阵指数的积分