zoukankan      html  css  js  c++  java
  • [转]java调用外部程序Runtime.getRuntime().exec

    Runtime.getRuntime().exec()方法主要用于执行外部的程序或命令

    Runtime.getRuntime().exec共有六个重载方法:

    • public Process exec(String command)

      在单独的进程中执行指定的字符串命令。

    • public Process exec(String [] cmdArray)

            在单独的进程中执行指定命令和变量

    • public Process exec(String command, String [] envp)

      在指定环境的独立进程中执行指定命令和变量

    • public Process exec(String [] cmdArray, String [] envp)

      在指定环境的独立进程中执行指定的命令和变量

    • public Process exec(String command,String[] envp,File dir)

      在有指定环境和工作目录的独立进程中执行指定的字符串命令

    • public Process exec(String[] cmdarray,String[] envp,File dir)

      在指定环境和工作目录的独立进程中执行指定的命令和变量

    我们先来比较exec(String command)与exec(String[] cmdArray)的区别,其实他们是等价的,最终都会调用:

    exec(String[] cmdarray,String[] envp,File dir),我们看看方法exec(String cmdarray,String[] envp,File dir) throws IOException的实现代码:

    1
    2
    3
    4
    5
    6
    7
    8
    public Process exec(String command, String[] envp, File dir) throws IOException {
        if (command.length() == 0throw new IllegalArgumentException("Empty command");
        StringTokenizer st = new StringTokenizer(command);
        String[] cmdarray = new String[st.countTokens()];
        for (int i = 0; st.hasMoreTokens(); i++)
            cmdarray[i] = st.nextToken();
        return exec(cmdarray, envp, dir);
    }

    从上面的代码,我们可以看出最终调用的代码都是:exec(String[] cmdArray,String envp,File  dir)。exec(String command)相当于exec(command,null,null),exec(String[] cmdArray)相当于exec(cmdArray,null,null)。

    参数说明

    cmdarray - 包含所调用命令及其参数的数组。

    envp - 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,或该参数为 null。

    dir - 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。

    另外,执行exec(String command)不等同于直接执行command line命令,比如命令:

    1
    javap -l xxx > output.txt

    这时要用exec(String[] cmdArray)。如例:

    1
    2
    Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",
        "javap -l xxx > output.txt"});

    关于返回结果类型:Process,它有几个方法:

    1.destroy():杀掉子进程

    2.exitValue():返回子进程的出口值,值 0 表示正常终止

    3.getErrorStream():获取子进程的错误流

    4.getInputStream():获取子进程的输入流

    5.getOutputStream():获取子进程的输出流

    6.waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止;

     (sun:所以,int exitValue = waitFor() 也可以用来检测进程进程是否正常终止。)

    (原文地址:http://km-moon11.iteye.com/blog/2258500)

  • 相关阅读:
    蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
    蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
    蚂蚁金服“定损宝”现身AI顶级会议NeurIPS
    报名 | 蚂蚁金服ATEC科技大会 · 上海:数字金融新原力
    前沿 | 中国中小银行都是如何展开数字化转型的?
    盘点:2018年双11背后的蚂蚁核心技术
    构筑敏捷能力中心,打造下一代数字银行“操作系统”!
    客户故事:4家银行如何打造新一代移动金融中心
    干货 | 金融级互联网产品持续交付的挑战与应对
    性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0
  • 原文地址:https://www.cnblogs.com/jianyungsun/p/6546553.html
Copyright © 2011-2022 走看看