可以参考《Process 详解 1》《Runtime 详解四》

ProcessBuilder 简述

  • public final class ProcessBuilder extends Object :此类用于创建操作系统进程。 
  • 每个 ProcessBuilder 实例管理一个进程属性集,start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。
  • 此类不是同步的,如果多个线程同时访问一个 ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须 保持外部同步。
  • 此类是JDK 5开始推出的,用于替代之前的Runtime类
  • 提前强调一遍:以前使用Runtime时,只要程序和参数的路径中没有空格是可以写到一起的;但是ProcessBuilder设置程序和参数时必须分开写,否则报错“系统找不到指定的文件”

构造函数

ProcessBuilder  List String command 

  • public ProcessBuilder (List<String> command) :利用指定的操作系统程序和参数构造一个进程生成器。
  1. 此构造方法不会 制作一份 command 列表的副本。
  2. 不必检查 command 是否为一个有效的操作系统命令。
  3. 参数:command - 包含程序及其参数的列表 ,程序和参数必须分开写
  4. 抛出: NullPointerException - 如果参数为 null

ProcessBuilder String... command 

  • public ProcessBuilder (String... command) :利用指定的操作系统程序和参数构造一个进程生成器。
  1. 这是一个有用的构造方法,它将进程生成器的命令设置为与 command 数组包含相同字符串的字符串列表,且顺序相同。
  2. 不必检查 command 是否为一个有效的操作系统命令。
  3. 参数:command - 包含程序及其参数的字符串数组,程序和参数必须分开写
@Test
public void testProcessBuilder() {
    try {
        /**下面这种程序和参数写在一起时,会报错" 系统找不到指定的文件。
         * Runtime可以这么写,但ProcessBuilder必须分开写"*/
        /*ProcessBuilder processBuilder = new ProcessBuilder(
                "D:\\PotPlayer\\PotPlayerMini.exe E:/wmx/zl2.mp4");*/

        ProcessBuilder processBuilder = new ProcessBuilder(
                "D:\\PotPlayer\\PotPlayerMini.exe",
                "E:/wmx/zl2.mp4");

        /** 调用start方法时,才算是真正启动子进程*/
        Process process = processBuilder.start();
        /** 休眠6秒后,关闭PotPlayer.exe程序*/
        Thread.sleep(6000);
        if (process.isAlive()) {
            process.destroyForcibly();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

方法摘要

ProcessBuilder 详解 1

command List String command

  • public ProcessBuilder command (List<String> command):设置此进程生成器的操作系统程序和参数。
  1. 此方法不会 制作一份 command 列表的副本。
  2. 不必检查 command 是否为一个有效的操作系统命令。
  3. 完全类似带list参数的构造器
  4. 参数:command - 包含程序及其参数的列表,程序和参数必须分开写
  5. 返回:此进程生成器 

 start 

  • public Process start() throws IOException:使用此进程生成器的属性启动一个新进程。 
  • 此方法检查命令是否为一条有效的操作系统命令,哪条命令是有效的呢?这取决于系统,但至少命令必须是非空字符串的非空列表。 
  • 返回:一个新的 Process 对象,用于管理子进程 
@Test
public void processBuilder2() {
    try {
        List<String> paramList = new ArrayList<>();
        paramList.add("cmd");
        paramList.add("/c");
        paramList.add("E:/wmx/re.txt");

        /** 创建ProcessBuilder对象,设置指令列表*/
        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(paramList);
        /**上面两句基本等同于下面这句*/
        /*ProcessBuilder processBuilder = new ProcessBuilder(paramList);*/
        /**启动子进程(会调用默认程序打开上面的re.txt文件)
         * 休眠6秒后,调用自己用JNA封装的一个方法结束此cmd.exe进程树*/
        Process process = processBuilder.start();
        Thread.sleep(6000);
        SystemUtils.killProcessTree(process);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

相关文章:

  • 2021-11-28
  • 2021-03-04
  • 2021-06-10
  • 2021-06-08
  • 2021-11-14
  • 2021-11-02
  • 2021-12-06
猜你喜欢
  • 2021-11-11
  • 2022-12-23
  • 2022-12-23
  • 2021-05-26
  • 2022-12-23
  • 2021-11-25
  • 2022-12-23
相关资源
相似解决方案