【问题标题】:Running a Perl script in Java using ProcessBuilder使用 ProcessBuilder 在 Java 中运行 Perl 脚本
【发布时间】:2013-04-26 21:07:29
【问题描述】:

我在 Java 中使用 ProcessBuilder 来运行 Perl 脚本。当我在打印进程的 InputStream 时运行 Perl 脚本时,Java 程序似乎在 Perl 脚本的持续时间内运行。但是,如果我在 main 中注释掉 getOutPut 方法,Java 程序会非常快地终止,并且 Perl 脚本根本不会运行。为什么会出现这种情况?

private final static String SCENARIO =  "scen"; 

/**
 * @param args
 */
public static void main(String[] args) {


    ProcessBuilder pb = new ProcessBuilder("perl", SCENARIO+".pl");
    pb.directory(new File("t:/usr/aman/"+SCENARIO));
    try {
        Process p = pb.start();
        getOutput(p.getInputStream(), true);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static List getOutput(InputStream is, boolean print) {
    List output = new ArrayList<String>();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    String s = null;
    try {
        while ((s = reader.readLine()) != null) {
            output.add(s);
            if(print){
                System.out.println(s);
            }
        }
        is.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        return null;
    }
    return output;
}

【问题讨论】:

    标签: java perl process processbuilder


    【解决方案1】:

    您的 PERL 脚本进程的操作系统输出流缓冲区可能会被填满,因为没有任何东西在清空该缓冲区,这将终止该进程。为此,您需要吞噬输出流,这就是您的 getOutput 方法为您做的事情。

    请阅读关于此问题的经典参考:When Runtime.exec() won't。根据这篇文章:

    由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

    【讨论】:

    • 太棒了!您的回答很完美,您将我链接到一篇很棒的文章以进一步理解。非常感谢!
    • @Aman:不客气,很高兴我能帮助你。请注意,该文章的某些部分已过时,因为它没有像我们现在应该做的那样使用 ProcessBuilder,而且我相信它的某些 Windows 调用现在不正确,但一般原则仍然适用。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2018-11-03
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多