java - 使用 ProcessBuilder 在 Java 中运行 Perl 脚本

标签 java perl process processbuilder

我正在 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;
}

最佳答案

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

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

Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

关于java - 使用 ProcessBuilder 在 Java 中运行 Perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245243/

相关文章:

objective-c - 有没有办法在进程之间共享核心数据存储?

java - 使用 Java Socket 发送 HTTP 响应时遇到问题

java - 从 java 代码打开命令提示符并运行一些命令并读取 cmd 提示符显示?

java - 如何使用 vm 参数从命令行运行 JUnit?

perl - 防止Perl打印相同的警告消息

perl - 'perl' 不被识别为外部或内部命令 *帮助配置草莓 perl!*

perl - 我可以设置一个 perl 脚本吗?

node.js - 如何终止node.js上的子进程?

java - Java 中如何在字符串中引发 int 值?

java - 是否可以使用 java 为 CPLEX 创建 .dat 文件?