欢迎光临
一个有态度、有温度的分享型博客

Java中使用ProcessBuilder启动、管理应用程序

介绍

ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。

每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。

使用ProcessBuilder比使用Process的好处在于,我们不仅仅可以去执行一个应用程序,还可以对执行进程进行更多的管理工作,比如:获取进程的执行信息,包括标准输出、标准错误输出;设置当前工作目录;改变环境参数。

构造方法和函数参见「官方API」!

用法示例

这是一个在Java代码中使用ffmpeg.exe工具,将多个MP4文件合成为一个的例子,具体代码如下:

/**
     * 合并多个Mp4(Avi)文件
     * @param ffmpegPath 合并工具路径
     * @param txtPath 待合并的文件每行一个保存的txt文件里
     * @param outPath 合并后的avi保存路径
     */
    public void mergeMp4s(String ffmpegPath,String txtPath,String outPath){
        List<String> command = new ArrayList<String>();
        command.add(ffmpegPath);
        command.add("-f");//合成音视频
        command.add("concat");
        command.add("-safe");
        command.add("0");
        command.add("-i");
        command.add(txtPath);
        command.add("-c");
        command.add("copy");
        command.add("-y");
        command.add(outPath);
        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.command(command);
            Process p = builder.start();
            if(p.isAlive()){
               p.waitFor();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

上面代码中,当前的执行线程会被p.waitFor();阻塞,也就是直到子进程执行完毕代码才会往下进行。

我们可以对子进程的标准输出和标准错误输出进行管理,参见Class Process,如下面的代码:

public static int doWaitFor(Process process) {
        int exitValue = -1; // returned to caller when p is finished
        InputStream error = process.getErrorStream();
        InputStream is = process.getInputStream();
        byte[] b = new byte[1024];
        int readbytes = -1;
        try {
            while ((readbytes = error.read(b)) != -1) {
                logger.info("标准错误输出信息:" + new String(b, 0, readbytes));
            }
            while ((readbytes = is.read(b)) != -1) {
                logger.info("标准输出信息:" + new String(b, 0, readbytes));
            }
        } catch (IOException e) {
            logger.error("等待进程结束出现错误!");
            e.printStackTrace();
        } finally {
            try {
                error.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return exitValue;
    }

参考文章:

  1. 深入研究java.lang.ProcessBuilder类
  2. ProcessBuilder and Process.waitFor(), how long does ist wait?

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址