打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ProcessBuilder 创建操作系统进程

目录

ProcessBuilder 概述

方法概述

API 测试

路径空格说明


ProcessBuilder 概述

1、public final class java.lang.ProcessBuilder extends Object :此类用于创建操作系统进程。 

2、每个 ProcessBuilder 实例管理一个进程属性集,start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

3、此类不是同步的,如果多个线程同时访问一个 ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须保持外部同步。

4、此类从 JDK 5 开始推出,用于替代之前的 Runtime 类,可以参考《Process 详解 1》《Runtime 详解四》

5、注意事项:使用 Runtime 时,只要程序和参数的路径中没有空格是可以写到一个参数中的,默认按空格分隔;但是ProcessBuilder 设置程序和参数必须分开写,否则报错:“系统找不到指定的文件”。

启动使用默认工作目录和环境的新进程很容易: 

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

构造函数

一共重载了两个构造函数,一个参数是 list,一个是 array。

public ProcessBuilder (List<String> command)

1)利用指定的操作系统程序和参数构造一个进程生成器

2)此构造方法不会 制作一份 command 列表的副本 

3)不会检查 command 是否为一个有效的操作系统命令。

4、参数:command - 包含程序及其参数的列表 ,程序和参数必须分开写

5、抛出: NullPointerException - 如果参数为 null

public ProcessBuilder (String... command)

1、利用指定的操作系统程序和参数构造一个进程生成器。

2、这是一个有用的构造方法,它将进程生成器的命令设置为与 command 数组包含相同字符串的字符串列表,且顺序相同。

3、不会检查 command 是否为一个有效的操作系统命令。

4、参数:command - 包含程序及其参数的字符串数组,程序和参数必须分开写

方法概述

更多 API 可以参考官方文档:https://docs.oracle.com/javase/8/docs/api/

public Process start() throws IOException

1)使用此进程生成器的属性启动一个新进程

2)此方法检查命令是否为一条有效的操作系统命令,哪条命令是有效的呢?这取决于系统,但至少命令必须是非空字符串的非空列表。 

3)返回:一个新的 Process 对象,用于管理子进程 

API 测试

1)启动 windows 自带的计算器

1、在 C:/windows/System32 目录下面,windows 系统自带了很多应用程序,如记事本、计算器、画图、shutdown 等等。

2、下面演示调用系统程序,不加参数,新开的程序就相当于一个子进程。

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.logging.Logger;
  5. /**
  6. * Created by Administrator on 2019/2/26 0026.
  7. */
  8. public class APITest {
  9. private static final Logger logger = Logger.getGlobal();//日志记录器
  10. public static void main(String[] args) {
  11. try {
  12. List<String> paramList = new ArrayList<>();
  13. //启动 windows 的计算器程序,第一个参数必须是可执行程序
  14. paramList.add("C:\\Windows\\System32\\calc.exe");
  15. /** 创建ProcessBuilder对象,设置指令列表*/
  16. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  17. logger.info("启动子进程...");
  18. Process process = processBuilder.start();
  19. logger.info("子进程启动完成...");
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

2)启动 Potplayer 播放一个指定的视频文件

1、各种安装的软件都可以进行打开,这里比如安装好的视频播放器,我这里安装的是 PotPlayer 播放器,路径为:D:\PotPlayer\PotPlayerMini.exe

2、很多程序是支持在 cmd 调用时传递参数的,如 chrome.exe 浏览器等等,potPlayer 也可以在调用时指定参数。

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.logging.Logger;
  5. /**
  6. * Created by Administrator on 2019/2/26 0026.
  7. */
  8. public class APITest {
  9. private static final Logger logger = Logger.getGlobal();//日志记录器
  10. public static void main(String[] args) {
  11. try {
  12. List<String> paramList = new ArrayList<>();
  13. //启动 windows 上安装好的 potplayer 播放器,设置 exe 路径,路径必须存在
  14. //第一个参数必须是可执行程序
  15. paramList.add("D:\\PotPlayer\\PotPlayerMini.exe");
  16. //设置 potplayer 将要播放的文件,也就是给 potplayer 传递的参数,文件必须存在
  17. paramList.add("E:\\Study_Note\\Spring Cloud\\视频\\第1天\\4 服务提供者与服务消费者.avi");
  18. /** 创建ProcessBuilder对象,设置指令列表*/
  19. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  20. logger.info("启动子进程...");
  21. Process process = processBuilder.start();
  22. logger.info("子进程启动完成...");
  23. for (int i = 5; i > 0; i--) {
  24. logger.info((i) + " 秒后结束子进程...");
  25. Thread.sleep(1000);
  26. }
  27. process.destroyForcibly();//强行终结开启的子进程
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }

然而并不是,所有的子进程,都能这么轻易杀死,对于需要在某些特定时刻杀死子进程的,可以参考:https://blog.csdn.net/wangmx1993328/article/details/80832181#t7 中的“杀死子进程 -> 解决方式 2” 部分。

3)使用 cmd 命令 ping 目标主机,然后将结果信息存放在指定文件中。

ping 目标主机:属于 windows 指令,如果自己的电脑和目标主机之间网络通畅,则会返回成功信息,否则返回失败信息。

  1. import javax.swing.filechooser.FileSystemView;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.logging.Logger;
  7. /**
  8. * Created by Administrator on 2019/2/26 0026.
  9. */
  10. public class APITest {
  11. private static final Logger logger = Logger.getGlobal();//日志记录器
  12. public static void main(String[] args) throws IOException {
  13. List<String> paramList = new ArrayList<>();
  14. //使用 cmd 命令 ping 远程主机
  15. //第一个参数必须是可执行程序,cmd也是一个可执行程序,位于 C:/Windows/System32目录下
  16. paramList.add("cmd");
  17. paramList.add("/c");
  18. paramList.add("ping www.taobao.com");//也可以是ip,如 paramList.add("ping 114.114.114.114");
  19. /** 创建ProcessBuilder对象,设置指令列表*/
  20. ProcessBuilder processBuilder = new ProcessBuilder(paramList);
  21. //获取桌面路径,如:C:\Users\Administrator.SC-201707281232\Desktop
  22. File desktopFile = FileSystemView.getFileSystemView().getHomeDirectory();
  23. //创建子进程输出信息的存放文件,文件不存在时,会自动创建
  24. File outputFile = new File(desktopFile, "output.txt");
  25. //返回此流程构建器的标准输出目标,意思是将来输出信息全部放在这个目标中
  26. processBuilder = processBuilder.redirectOutput(outputFile);
  27. processBuilder.start();//启动进程构建器
  28. logger.info("子进程执行消息存放在:" + processBuilder.redirectOutput().file().getPath());
  29. }
  30. }

4)directory(File directory)  设置此进程构建器的工作目录,注意它是为参数列表中程序参数设置工作目录,而不是程序的工作目录,下面通过实例理解。

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.logging.Logger;
  6. /**
  7. * Created by Administrator on 2019/2/26 0026.
  8. */
  9. public class APITest {
  10. private static final Logger logger = Logger.getGlobal();//日志记录器
  11. public static void main(String[] args) throws IOException {
  12. List<String> paramList = new ArrayList<>();
  13. paramList.add("C:/windows/system32/notepad.exe");//启动系统的记事本,第一个参数必须是可执行程序
  14. //打开 E:/wmx/test/123.txt 文件,文件必须存在
  15. //应该在 start 之前切换工作目录到 E:/wmx/test
  16. paramList.add("123.txt");
  17. ProcessBuilder pb = new ProcessBuilder(paramList);
  18. //切换进程构建器的工作目录到 E:/wmx/test 下,这样上面才能简写 123.txt时找到文件
  19. //必须注意的是 directory 是为paramList中的参数 "123.txt" 设置的工作目录,,而不是程序 "C:/windows/system32/notepad.exe"
  20. //程序要么就是写全路径,要么就是配置系统环境变量才能写简称,如 calc、notepad 等
  21. pb.directory(new File("E:/wmx/test/"));
  22. pb.start();//开启子进程
  23. logger.info(pb.directory() + ":当前工作目录");//默认情况下,未设置时,输出为 null
  24. }
  25. }

路径空格说明

1)如下使用 Office 的 Word.exe 打开一个 docx 文件,Word.exe 与 .docx 文件路径有空格都是可以的,Word.exe 与 .docx 分别占一个元素:

正确:[cmd, /c, C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE, E:\wmx\MR软件说明书.docx]

2)如下使用 PotPlayer 播放一个 mp4文件,mp4文件路径含有空格,可以将空格路径作为一个元素,也可以将路径空格位置切分为多个元素:
正确:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w s\sh k\8.mp4]
正确:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w, s\sh, k\8.mp4]

3)如下的本意是想让 Chrome 浏览器全屏模式打开一个地址,因为 --kiosk 与后面的浏览器地址一共是两个参数,所以写法一正确,写法二错误。

正确:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk, http://www.baidu.com]
错误:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk http://www.baidu.com]

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java 执行shell命令及日志收集避坑指南
实现functor - 增强型的函数指针
再识CMD命令,黑客的基本操作你学会了多少?
隐藏在XP安装盘上的安全工具
python学习 subprocess模块
Windows 2000系统编程——进程的创建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服