JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法
一. 背景
ProcessBuilder类是用来创建操作系统进程的。与Runtime.exec相比,它提供了更加方便的方法以创建子进程。
每个ProcessBuilder实例管理着一个进程属性的集合。 start()方法用这些属性创建一个新的Process实例。start()方法可以从同一个实例重复调用(可以更改属性值后再调用)。
每个ProcessBuilder实例管理着进程的如下属性:
- 一条命令(a command),可以用List来表示,也可以用变长字符串。命令后面的参数与命令合并在一起。如:“cmd /c dir”,可以拆分为三个字符串,也可以放到一个List中。
- 一个运行环境(an environment),提供系统变量,初始值是当前进程的环境变量(参考:
System.getenv())。 - 一个工作目录(a working directory),默认值为当前进程所在目录。
- 一个重定向错误流属性(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();
}
}
JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法的更多相关文章
- JDK1.7新特性,语言篇
1. 可以用二进制表达数字 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long // 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, ...
- JDK1.5新特性,语言篇
Java 1.5版本,就是Java 2 Standard Edition 5,Version 1.5,简称Java 5.版本代号Tiger. 一. 泛型(Generics) C++通过模板技术可以指定 ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27
Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承 ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK1.8新特性——Stream API
JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- JDK1.8新特性之(二)--方法引用
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
随机推荐
- easyui combobox实现本地模糊查询
直接上代码 $("#combobox1").combobox({ valueField : "value", textField : "text&qu ...
- 通过HTML5 Visibility API检测页面活动状态
几年前,我们浏览网页的时候是没有选项卡浏览模式的,每一个网页都会是一个浏览器窗口,如果我没有记错,Win7之前我们都是这样浏览网页的.作为一个程序员,我们经常会同时打开10-15个网页,多的时候超过2 ...
- “/”应用程序中的server错误
前几天敲ASP.NET有关验证控件的样例的时候,出现了这个问题: 可是对于这个问题我们应该都不陌生,之前敲牛腩的时候也出现过,当时的解决方法是: 在web.config中找 <a ...
- 帝吧fb出征是什么原因?帝吧fb出征事情始末 帝吧出征FB打“台独” 台湾网民崩溃:巨人之墙爆了
帝吧出征FB打"台独" 台湾网民崩溃:巨人之墙爆了 发表时间:2016-01-20 21:08:10 字号:A-AA+ 关键字: 帝吧帝吧出征FB帝吧出征FB打台独台独脸书巨人之墙 ...
- 单页WEB应用(三),Chat聊天模块
Chat 聊天模块 这个模块应该就是该书全篇的唯一一个模块吧,后面差点儿全部的篇章都环绕这个模块去实现的,只是就通过这一个模块的实现和上线,也能体现单页应用开发到公布上线的整个过程,毕竟后面的数据.通 ...
- Service 隔离
最近开发了两个App,其中一个App为另一个App提供服务(Service),但要求不允许其他的App使用此服务,一开始的想法是能在API的设计上进行过滤,后来想想此方法不是很安全,被别人反 ...
- 简单通俗讲解DOM
在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深对DOM的理解,从而对它有一个全面的认识. 什么是DOM DOM的全称是Docum ...
- Struts2(五)Action二配置
一.method参数 action package com.pb.web.action; public class HourseAction { public String add(){ System ...
- 【剑指offer】二分查找二维数组
1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10 例子输出: Yes No No 时间限制:1 秒 内存限制:3 ...
- java 动态生成类再编译最后代理
package spring.vhostall.com.proxy; public interface Store { public void sell(); } ------------------ ...