Java在windows和linux上调用外部程序

16人阅读 评论(0) 收藏 举报
分类:

在用java开发时,有时候会遇到需要调用系统命令或者外部脚本,当前文章给出调用方法。代码如下:

    /**
     * 转换脚本路径为在win、linux中可执行的命令
     * 
     * @param scriptPath
     *            脚本路径
     * @return 在linux或window中可执行的命令
     */
    public static String[] convertExecuteCommand(String scriptPath) {
        String[] cmdArray = null;
        if (SystemUtil.isWindows()) {
            LinkedList<String> cmdList = new LinkedList<String>();
            cmdList.addFirst(cmdFormat(scriptPath));
            cmdArray = cmdList.toArray(new String[cmdList.size()]);
        }
        if (SystemUtil.isLinux()) {
            String path = scriptPath.substring(0, scriptPath.lastIndexOf(File.separator));
            String cmdV = scriptPath.substring(scriptPath.lastIndexOf(File.separator) + 1, scriptPath.length() - 1);
            String cmdCommand = buildCmdCommand("&&", cmdV, path, new String[] {});
            cmdArray = new String[] { "/bin/sh", "-c", cmdCommand };
        }
        logger.debug(HikLog.toLog(HikLog.message("parameter convert execute command is:{}")), Arrays.toString(cmdArray));
        return cmdArray;
    }

    /**
     * 将脚本参数和参数转换为win、linux中可执行的命令
     * 
     * @param scriptPath
     * @param parameterArray
     * @return
     */
    public static String[] convertExecuteCommand(String scriptPath, String[] parameterArray) {
        String[] cmdArray = new String[] {};
        if (SystemUtil.isWindows()) {
            LinkedList<String> cmdList = new LinkedList<String>();
            for (int i = 0; i < parameterArray.length; i++) {
                cmdList.add(parameterArray[i]);
            }
            cmdList.addFirst(cmdFormat(scriptPath));
            cmdArray = cmdList.toArray(new String[cmdList.size()]);
        }
        if (SystemUtil.isLinux()) {
            String path = scriptPath.substring(0, scriptPath.lastIndexOf(File.separator));
            String cmdV = scriptPath.substring(scriptPath.lastIndexOf(File.separator) + 1, scriptPath.length() - 1);
            String[] message = new String[] {};
            for (int i = 0; i < parameterArray.length; i++) {
                message[i] = parameterArray[i];
            }
            String cmdCommand = buildCmdCommand("&&", cmdV, path, message);
            cmdArray = new String[] { "/bin/sh", "-c", cmdCommand };
        }
        return cmdArray;
    }

    /**
     * 从process中获取执行结果
     * 
     * @param cmdArray
     * @param process
     * @return
     */
    public static List<String> getAgentReturnValue(String[] cmdArray, Process process) {
        BufferedReader inputBufferedReader = null;
        LinkedList<String> inputResult = new LinkedList<String>();
        BufferedReader errorBufferedReader = null;
        LinkedList<String> errorResult = new LinkedList<String>();
        try {
            inputBufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
            String inputLine = null;
            while ((inputLine = inputBufferedReader.readLine()) != null) {
                logger.debug(HikLog.toLog(HikLog.message("input result line is:{}")), inputLine);
                inputResult.add(inputLine);
            }

            errorBufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), Charset.forName("GBK")));
            String errorLine = null;
            while ((errorLine = errorBufferedReader.readLine()) != null) {
                logger.debug(HikLog.toLog(HikLog.message("error result line is:{}")), errorLine);
                errorResult.add(errorLine);
            }

            if (CollectionUtils.isEmpty(inputResult) && CollectionUtils.isEmpty(errorResult)) {
                logger.info(HikLog.toLog(HikLog.message("return value is empty and sendmessage is:{}")), Arrays.toString(cmdArray));
                throw new ProgramException(DataManagerErrorCode.AGENT_RETURN_RESULT_NULL, DataManagerErrorCode.AGENT_RETURN_RESULT_NULL);
            }
        } catch (Exception e) {
            if (e instanceof ProgramException) {
                throw (ProgramException) e;
            }

            logger.info(HikLog.toLog(HikLog.message("sendmessage is:{} and from BufferedReader reader and  return value has a exception:{}")),
                    Arrays.toString(cmdArray), e);
            throw new ProgramException(DataManagerErrorCode.GET_TASK_RECORD_ERROR, DataManagerErrorCode.GET_TASK_RECORD_ERROR);
        } finally {
            IOUtils.closeQuietly(inputBufferedReader);
            IOUtils.closeQuietly(errorBufferedReader);
        }
        inputResult.addAll(errorResult);
        return inputResult;
    }

    /**
     * 执行脚本
     * 
     * @param cmdArray
     * @return
     */
    public static Process executeScript(String[] cmdArray) {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(cmdArray);
        } catch (Exception e) {
            logger.info(HikLog.toLog(HikLog.message("execute cmd commond has a exception:{}")), e);
            throw new ProgramException(DataManagerErrorCode.EXECUTE_CMD_COMMOND_ERROR, DataManagerErrorCode.EXECUTE_CMD_COMMOND_ERROR);
        }
        return process;
    }

    /**
     * 执行命令行
     * 
     * @param cmdArray
     * @return
     */
    public static Process executeCommand(String command) {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(command);
        } catch (Exception e) {
            logger.info(HikLog.toLog(HikLog.message("execute cmd commond has a exception:{}")), e);
            throw new ProgramException(DataManagerErrorCode.EXECUTE_CMD_COMMOND_ERROR, DataManagerErrorCode.EXECUTE_CMD_COMMOND_ERROR);
        }
        return process;
    }

    /**
     * 转译命令行
     * 
     * @param str
     * @return
     */
    public static String cmdFormat(String str) {
        String dest = "";
        if (str != null) {
            Pattern p = Pattern.compile("\t|\r|\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        dest = dest.replaceAll("\"", "\\\\\"");
        return dest;
    }

    /**
     * 组装cmd命令
     * 
     * @param connector
     *            cmd命令之间连接符,bat文件内用\r\n,直接执行用&&
     * @param cmdV
     *            bat或exe文件名 --start.bat
     * @param path
     *            bat或exe文件所在目录
     * @param parameters
     *            bat参数
     * @return
     */
    public static String buildCmdCommand(String connector, String cmdV, String path, String[] parameters) {
        StringBuilder cmd = new StringBuilder();

        cmd.append("cd \"").append(path).append("\"").append(connector);
        cmd.append("./").append(cmdV);

        if (null != parameters) {
            for (String para : parameters) {
                cmd.append(" " + para);
            }
        }
        return cmd.toString();
    }
查看评论

linux C程序调用外部程序的几种方法

1、system(执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include 定义函数 int system(const char ...
  • beckdon
  • beckdon
  • 2013-09-03 09:22:54
  • 3400

在Java中执行脚本命令以及调用外部程序说明

在Java中执行脚本命令以及调用外部程序说明 一、Java中关于ProcessBuilder 和 Runtime 类的介绍 在Java中要想调用脚本或者其他程序必须通过ProcessBuilder...
  • u012875880
  • u012875880
  • 2014-02-20 10:11:42
  • 9606

Java——调用Linux和Windows下命令行执行程序

项目需求:需要在后端调用其他程序并且获取返回结果 第一个版本环境:Windows //cmdstr为命令参数  public boolean excuteCmd(String cmdstr) {  ...
  • u013507760
  • u013507760
  • 2016-07-13 17:07:51
  • 1894

java调用外部程序的方法

1 java调用外部程序的方法  在一个java应用中,可能会遇到这样的需求,就是需要调用一些外部的应用做一些处理,比如调用excel,然后在继续程序的运行。  下面就开始进入java调用外部程...
  • gundumw100
  • gundumw100
  • 2017-04-10 17:18:33
  • 222

用JAVA调用外部程序并截出程序运行结果

  • 2011年08月24日 14:23
  • 7KB
  • 下载

通过Java运行一个外部程序

  • 2008年10月23日 16:33
  • 25KB
  • 下载

java调用需要输入的外部可执行程序

使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。   1. exec(String command)   2. exec(String command,...
  • Hu199055
  • Hu199055
  • 2017-05-25 08:37:58
  • 924

vc调用外部程序参考

  • 2011年05月20日 11:11
  • 13KB
  • 下载

mysql触发器调用外部脚本

源码: #在tbls表上面创建触发器 #由于不能查询到刚插入的那条记录。所以只能在这边手动的传参 drop TRIGGER trigger_tbls; create TRIGGER trigg...
  • u011134182
  • u011134182
  • 2014-09-30 11:55:37
  • 1163

linuxc多进程与外部程序调用(转载)

最近在学习linux环境高级编程,多进程编程算是编程中的最重要的一个部分了,本文让我学习和明白了很多,所以转载过来。让更多想多线程编程的人学习。只有顶到首页才能让更多的人学习。 文章摘要:   ...
  • jiangheng0535
  • jiangheng0535
  • 2014-03-28 09:57:57
  • 1364
    个人资料
    专栏达人
    等级:
    访问量: 10万+
    积分: 1424
    排名: 3万+
    博客专栏
    最新评论