首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ProcessBuilder在Java中运行Perl脚本

使用ProcessBuilder在Java中运行Perl脚本
EN

Stack Overflow用户
提问于 2013-04-27 05:07:29
回答 1查看 3.4K关注 0票数 2

我正在使用Java语言中的ProcessBuilder来运行Perl脚本。当我在打印进程的InputStream的同时运行Perl脚本时,Java程序似乎在Perl脚本期间运行。但是,如果我注释掉main中的getOutPut方法,Java程序很快就会终止,而且Perl脚本根本不会运行。为什么会发生这种情况?

代码语言:javascript
运行
复制
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;
}
EN

Stack Overflow用户

回答已采纳

发布于 2013-04-27 05:08:54

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

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

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

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16245243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档