目录

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 - 包含程序及其参数的字符串数组,程序和参数必须分开写

方法概述

Modifier and Type Method and Description
List<String> command()返回此流程构建器的操作系统程序和参数。
ProcessBuilder command(List<String> command) 设置此流程构建器的操作系统程序和参数。
ProcessBuilder command(String... command)设置此流程构建器的操作系统程序和参数。
File directory()返回此进程构建器的工作目录。
ProcessBuilder directory(File directory)设置此进程构建器的工作目录。
Map<String,String> environment()返回此流程构建器环境的字符串映射视图。
ProcessBuilder inheritIO()将子进程标准I / O的源和目标设置为与当前Java进程相同。
ProcessBuilder.Redirect redirectError()返回此流程构建器的标准错误目标。
ProcessBuilder redirectError(File file)将此流程构建器的标准错误目标设置为文件。
ProcessBuilder redirectError(ProcessBuilder.Redirect destination)设置此流程构建器的标准错误目标。
boolean redirectErrorStream()告诉这个进程构建器是否合并标准错误和标准输出。
ProcessBuilder redirectErrorStream(boolean redirectErrorStream)设置此过程构建器的 redirectErrorStream属性。
ProcessBuilder.Redirect redirectInput()返回此流程构建器的标准输入源。
ProcessBuilder redirectInput(File file)将此流程构建器的标准输入源设置为文件。
ProcessBuilder redirectInput(ProcessBuilder.Redirect source)设置此流程构建器的标准输入源。
ProcessBuilder.Redirect redirectOutput()返回此流程构建器的标准输出目标。
ProcessBuilder redirectOutput(File file)将此流程构建器的标准输出目标设置为文件。
ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)设置此流程构建器的标准输出目标。
Process start()使用此流程构建器的属性启动新进程。

更多 API 可以参考官方文档:http://www.matools.com/api/java8

public Process start() throws IOException

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

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

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

API 测试

启动 windows 自带的计算器

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

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

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

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

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

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

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

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

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

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

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

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

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

路径空格说明

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]

ProcessBuilder 创建操作系统进程相关推荐

  1. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  2. Linux操作系统进程模型分析

    Linux操作系统简介 Linux拥有现代操作系统的功能,如真正的抢先式多任务处理,支持多用户内存,保护虚拟内存,支持SMP.UP,符合POSIX 标准联网.图形用户接口和桌面环境具有快速性.稳定性等 ...

  3. 大学计算机打开文件过程演示实验记录表,操作系统进程与文件管理 实验报告表 作业 5.doc...

    精品文档 . (本文档包含: 实验5 实验报告 与 第5周作业题) 实验5 操作系统进程与文件管理 实验报告 学号 1404505147 姓名禤雨骅 班级: 临床医学14(1) 实验时间:2015 年 ...

  4. 计算机进程同步实验观察结果记录表,实验5 操作系统进程与文件管理 实验报告表 作业 5.doc...

    实验5操作系统进程与文件管理实验报告表 (本文档包含: 实验5 实验报告 与 第5周作业题) 实验5 操作系统进程与文件管理 实验报告 学号 1404505147 姓名禤雨骅 班级: 临床医学14(1 ...

  5. Java操作系统进程调度算法——时间片轮转(RR)算法

    Java操作系统进程调度算法--时间片轮转(RR)算法 文章目录 Java操作系统进程调度算法--时间片轮转(RR)算法 前言 一.算法思想 二.数据结构 1.定义PCB进程控制块 2.实现思路 三. ...

  6. Java操作系统进程调度算法——优先级调度(HPF)算法

    Java操作系统进程调度算法--优先级调度(HPF)算法 文章目录 Java操作系统进程调度算法--优先级调度(HPF)算法 前言 一.算法思想 二.数据结构 1.定义(PCB)进程控制块 2.实现思 ...

  7. 实验二 创建显示系统进程的信息的proc模块

    实验二 创建显示系统进程的信息的proc模块 目录 实验二 创建显示系统进程的信息的proc模块 实验环境 一.实验目的 二.实验内容 三.实验步骤 四.实验总结 实验环境 操作系统版本:ubuntu ...

  8. Java操作系统进程调度算法——先来先服务(FCFS)算法

    Java操作系统进程调度算法--先来先服务(FCFS)算法 Java操作系统进程调度算法--先来先服务(FCFS)算法 文章目录 Java操作系统进程调度算法--先来先服务(FCFS)算法 前言 一. ...

  9. linux操作系统中查找某个进程,在linux下查看有哪些操作系统进程正在使用某一个共享内存段...

    [root@abc log]# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch st ...

  10. 9.1 LSMW程序创建操作手册 第1 2步

    9.1 LSMW程序创建操作手册-录屏 LSMW是通过录屏来进行批量数据导入和修改的一个SAP标准功能,个别事物码需要不能使用鼠标上下滑动录屏,需要使用键盘上下键. 第1步 LSMW程序创建步骤 步骤 ...

最新文章

  1. 第5次作业+105032014166+张珍珍
  2. 马斯克直聘AI人才:高中毕没毕业无所谓,但是编程能力得过硬
  3. 会话跟踪技术之Cookie
  4. Saltstack 报错 python-crypto randomPool_DeprecationWarning:
  5. 滴滴经验分享:SQLFlow如何让运营专家用上AI?
  6. C++关键字this
  7. php 输出可以设置格式文件,PHP实现的文件直接输出下载
  8. win7下import pytorch报错AttributeError: function 'AddDllDirectory' not found
  9. Lesson 08 for Plotting in R for Biologists
  10. AgentWeb url监听问题
  11. 支付宝微信QQ钱包收款码合并教程及源码下载
  12. C# 按层选择 AutoCAD二次开发
  13. 麻省理工遍地走,6年经验安卓程序员面试微软,靠这份思维脑图拿下Offer!
  14. 情感预测SHINE: Signed Heterogeneous Information Network Embedding for Sentiment Link Prediction引介
  15. 贝叶斯公式求解公园凉鞋问题
  16. MSP430(CCS工程下)添加printf实现打印功能
  17. dns被劫持怎么办?网页总是跳转到别的、你的DNS可能被劫持了!
  18. 支付宝 二维码/账号/转账码/生成方式/生成不可修改金额码
  19. Qt使用QCustomPlot画坐标图教程
  20. Android性能:内存篇之内存回收

热门文章

  1. 基于Monorail的系统功能模块化
  2. 服务器获取用户信息失败是什么原因,花粉俱乐部获取用户信息失败怎么解决?花粉俱乐部登录失败是什么原因?[多图]...
  3. js基础知识汇总01
  4. 十行代码训练sklearn七种分类算法
  5. Python基于迁移学习的手势识别实战【图像多分类任务】【实测准确度超过99.5%】
  6. 服务器芯片组 硒武,不到两个月的服务器,武器炼化出这属性是什么水平?
  7. 2021-08-04 模糊查询
  8. android studio 登录与注册,Android Studio登录/注册系统构想
  9. oracle闪回scn,Oracle闪回查询及scn_to_timestamp
  10. python用正则表达式提取中文_用正则表达式从Python中的字符串中提取数字