一. 背景

ProcessBuilder类是用来创建操作系统进程的。与Runtime.exec相比,它提供了更加方便的方法以创建子进程。

每个ProcessBuilder实例管理着一个进程属性的集合。 start()方法用这些属性创建一个新的Process实例。start()方法可以从同一个实例重复调用(可以更改属性值后再调用)。

每个ProcessBuilder实例管理着进程的如下属性:

  1. 一条命令(a command),可以用List来表示,也可以用变长字符串。命令后面的参数与命令合并在一起。如:“cmd /c dir”,可以拆分为三个字符串,也可以放到一个List中。
  2. 一个运行环境(an environment),提供系统变量,初始值是当前进程的环境变量(参考:System.getenv())。
  3. 一个工作目录(a working directory),默认值为当前进程所在目录。
  4. 一个重定向错误流属性(a redirectErrorStream property),初始值为false。就是设置错误流是否重定向到标准输出流(合二为一),还是分开。 如果合并(属性值设置为true)的话,那么可以通过Process.getInputStream()获取标准输出和错误输出。

二. 示范代码

这是一个执行调用外部命令(D:\\Software\\PngMate.exe)完成将gif文件(D:\\Work\\yz.gif)转换为png文件(D:\\Work\\yz.png)的方法。

1. 旧代码

    @Test
// JDK1.5之前的做法
public void testProcessOld() throws Exception {
// 调用Runtime的命令,直接拼成一个可以在DOS中运行的命令即可。
String cmd = "cmd /c PngMate.exe " + gifSource + " " + pngDest; // 命令执行环境,这里就是设置Path变量
String[] envp = new String[]{
"Path=" + System.getenv("Path") + exeDir
};
Process p = Runtime.getRuntime().exec(cmd, envp, new File(workDir));
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

2. 新代码

    @Test
// JDK1.5之后的新方式
public void testProcessNew() throws Exception {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "PngMate.exe", gifSource, pngDest);
Map<String, String> env = pb.environment();
env.put("Path", env.get("Path") + exeDir); // 更方便的设置环境变量的方式
pb.directory(new File(workDir));
Process p2 = pb.start();
try {
p2.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
} }

ProcessBuilder的优势在于,可以更改command、environment、working directory、redirectErrorStream property这些值,再次启动

这在需要循环处理任务、或者是多个相近的任务时非常有效。下面两行代码表示再转换一个文件。

        pb.command("cmd", "/c", "PngMate.exe", "505.gif", "505.png");
pb.start();

完整代码

package com.clzhang.sample.thinking;

import java.io.*;
import java.util.*; import org.junit.Test; // 这是一个执行调用外部命令(D:\\Software\\PngMate.exe)完成将gif文件(D:\\Work\\yz.gif)转换为png文件(D:\\Work\\yz.png)的方法。
public class JDK15Process {
String exeDir = "D:\\Software"; // PngMate.exe文件存放目录
String workDir = "D:\\Work"; // 工作目录
String gifSource = "yz.gif"; // 需要转换的源文件,于工作目录下
String pngDest = "yz.png"; // 转换后的目标文件,转换后存放于工作目录下 @Test
// JDK1.5之前的做法
public void testProcessOld() throws Exception {
// 调用Runtime的命令,直接拼成一个可以在DOS中运行的命令即可。
String cmd = "cmd /c PngMate.exe " + gifSource + " " + pngDest; // 命令执行环境,这里就是设置Path变量
String[] envp = new String[]{
"Path=" + System.getenv("Path") + exeDir
};
Process p = Runtime.getRuntime().exec(cmd, envp, new File(workDir));
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Test
// JDK1.5之后的新方式
public void testProcessNew() throws Exception {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "PngMate.exe", gifSource, pngDest);
Map<String, String> env = pb.environment();
env.put("Path", env.get("Path") + exeDir); // 更方便的设置环境变量的方式
pb.directory(new File(workDir));
Process p2 = pb.start();
try {
p2.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
} // ProcessBuilder的优势在于,可以更改command、environment、working directory、redirectErrorStream property这些值,再次启动
// 这在需要循环处理任务、或者是多个相近的任务时非常有效。
// 下面两行代码表示再转换一个文件。
pb.command("cmd", "/c", "PngMate.exe", "505.gif", "505.png");
pb.start();
}
}

最新文章

  1. java反编译获取源码
  2. Zabbix使用点滴
  3. linux下共享库的注意点之-fpic
  4. flume整合kafka
  5. SQL如何增删修改字段
  6. jQuery积累
  7. UVA 10801 Dij最短路(改模板)
  8. 12 Tips for Accurate Project Estimating
  9. DataGridView操作
  10. hdu 2579 Dating with girls(2)
  11. JNA开发中的问题积累
  12. 将android中的sample例子到eclipse中
  13. ligerUI调用$.ligerDialog.open弹出窗口关闭
  14. fstream,ifstream,ofstream 详解与用法
  15. ubuntu PHP相关操作
  16. NEO从入门到开窗(3) - NEO编译器
  17. SaltStack说明文档
  18. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)
  19. AYUI7 WPF MVC插件欣赏
  20. E. Train Hard, Win Easy

热门文章

  1. java编程思想---对象
  2. 100款免费的旅游素材(PSD)
  3. mysql命令的一些参数
  4. C#.NET常见问题(FAQ)-程序如何单步调试和设置断点
  5. 读取Style符号库样式的方法
  6. ifconf和ifreq
  7. 关于ASP.NET MVC中Form Authentication与Windows Authentication的简单理解
  8. 用Navicat Premium 操作MySQL数据库
  9. js 动画性能分析 transfrom
  10. hadoop的namenode无法启动的解决的方法