可以参考《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) :利用指定的操作系统程序和参数构造一个进程生成器。
- 此构造方法不会 制作一份 command 列表的副本。
- 不必检查 command 是否为一个有效的操作系统命令。
- 参数:command - 包含程序及其参数的列表 ,程序和参数必须分开写
- 抛出: NullPointerException - 如果参数为 null
ProcessBuilder String... command
- public ProcessBuilder (String... command) :利用指定的操作系统程序和参数构造一个进程生成器。
- 这是一个有用的构造方法,它将进程生成器的命令设置为与 command 数组包含相同字符串的字符串列表,且顺序相同。
- 不必检查 command 是否为一个有效的操作系统命令。
- 参数: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(); } }
方法摘要
command List String command
- public ProcessBuilder command (List<String> command):设置此进程生成器的操作系统程序和参数。
- 此方法不会 制作一份 command 列表的副本。
- 不必检查 command 是否为一个有效的操作系统命令。
- 完全类似带list参数的构造器
- 参数:command - 包含程序及其参数的列表,程序和参数必须分开写
- 返回:此进程生成器
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(); } }