ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();
要利用一组明确的环境变量启动进程,在添加环境变量之前,首先调用 Map.clear()。
二、API预览
构造方法摘要
ProcessBuilder(List<String> command) 利用指定的操作系统程序和参数构造一个进程生成器。
ProcessBuilder(String... command) 利用指定的操作系统程序和参数构造一个进程生成器。
command() 返回此进程生成器的操作系统程序和参数。
command(List<String> command) 设置此进程生成器的操作系统程序和参数。
command(String... command)
设置此进程生成器的操作系统程序和参数。
directory() 返回此进程生成器的工作目录。
directory(File directory) 设置此进程生成器的工作目录。
返回此进程生成器环境的字符串映射视图。
redirectErrorStream() 通知进程生成器是否合并标准错误和标准输出。
redirectErrorStream(boolean redirectErrorStream) 设置此进程生成器的 redirectErrorStream 属性。
start() 使用此进程生成器的属性启动一个新进程。
三、常见应用
若要使用ProcessBuilder创建一个进程,只需要创建ProcessBuilder的一个实例,指定该进程的名称和所需参数。要执行此程序,调用该实例上的start()即可。下面上一个执行Windows记事本的例子。注意它将要编辑的文件名指定为一个参数。
class PBDemo {
public static void main(String args[]) {
try {
ProcessBuilder proc = new ProcessBuilder("notepad.exe", "testfile");
proc.start();
} catch (Exception e) {
System.out.println("Error executing notepad.");
其他demo
/** 获取Windows系统下的网卡的MAC地址 */
public static List<String> getPhysicalAddress() {
Process p = null;
List<String> address = new ArrayList<String>(); // 物理网卡列表
try {
p = new ProcessBuilder("ipconfig", "/all").start(); // 执行ipconfig/all命令
} catch (IOException e) {
e.printStackTrace();
return address;
byte[] b = new byte[1024];
int readbytes = -1;
StringBuffer sb = new StringBuffer();
// 读取进程输出值
// 在JAVA IO中,输入输出是针对JVM而言,读写是针对外部数据源而言
InputStream in = p.getInputStream();
try {
while ((readbytes = in.read(b)) != -1) {
sb.append(new String(b, 0, readbytes, "gbk"));
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e2) {
e2.printStackTrace();
// 以下是分析输出值,得到物理网卡
String rtValue = sb.toString();
int i = rtValue.indexOf("Physical Address. . . . . . . . . :");
while (i > 0) {
rtValue = rtValue.substring(i
+ "Physical Address. . . . . . . . . :".length());
address.add(rtValue.substring(1, 18));
i = rtValue.indexOf("Physical Address. . . . . . . . . :");
return address;
demo2
public static void p1() {
try {
List<String> cmd = new LinkedList<String>();
cmd.add("java");
cmd.add("-version");
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
Process p = pb.start();
// 取得命令结果的输出流
InputStream fis = p.getInputStream();
// 用一个读输出流类去读
InputStreamReader isr = new InputStreamReader(fis);
// 用缓冲器读行
BufferedReader br = new BufferedReader(isr);
String line = null;
// 直到读完为止
while ((line = br.readLine()) != null) {
System.out.println(line);
} catch (Exception e) {
System.out.print(e.toString());