JDK5.0特性,使用ProcessBuilder执行本地命令
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- /**
- * 在J2SE5.0之前使用Runtime的exec方法执行本地命令.
- * 在J2Se5.0之后,可以使用ProcessBuilder执行本地命令
- * 它提供的功能更加丰富,能够设置设置工作目录、环境变量等
- * 本例PorcessBuilder执行Windows操作系统的"ipconfig/all"命令,获取本机网卡的MAC地址
- */
- /**关键技术剖析
- * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象
- * ProcessBuilder的environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量
- * ProcessBuilder的directory方法切换工作目录
- * Process的getInputStream方法获得进程的标准输出流,getErrorStream方法获得进程的错误输出流
- */
- public class UsingProcessBuilder {
- /**获取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){
- 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));
- }
- }catch(IOException e1){
- }finally {
- try{
- in.close();
- }catch (IOException e2){
- }
- }
- //以下是分析输出值,得到物理网卡
- 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;
- }
- /**执行自定义的一个命令,该命令放在C:/temp下,并且需要两个环境变量的支持*/
- public static boolean executeMyCommand1(){
- //创建系统进程创建器
- ProcessBuilder pb = new ProcessBuilder("myCommand","myArg1","myArg2");
- Map<String, String> env = pb.environment(); //获得进程的环境
- //设置和去除环境变量
- env.put("VAR1", "myValue");
- env.remove("VAR0");
- env.put("VAR2", env.get("VAR1") + ";");
- //迭代环境变量,获取属性名和属性值
- Iterator it=env.keySet().iterator();
- String sysatt = null;
- while(it.hasNext())
- {
- sysatt = (String)it.next();
- System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));
- }
- pb.directory(new File("C:/temp"));
- try{
- Process p = pb.start(); //得到进程实例
- //等待进程执行完毕
- if(p.waitFor() != 0){
- //如果进程运行结果不为0,表示进程是错误退出的
- //获得进程实例的错误输出
- InputStream error = p.getErrorStream();
- //do something
- }
- InputStream sdin = p.getInputStream(); //获得进程实例的标准输出
- //do something
- }catch(IOException e){
- }catch(InterruptedException e){
- }
- return true;
- }
- public static void executeMyCommand2(){
- ProcessBuilder pb = null;
- String sysatt = null;
- try
- {
- //创建一个进程示例
- pb = new ProcessBuilder("cmd.exe");
- //获取系统参数并打印显示
- Map<String, String> env = pb.environment();
- Iterator it=env.keySet().iterator();
- while(it.hasNext())
- {
- sysatt = (String)it.next();
- System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));
- }
- //设置工作目录
- pb.directory(new File("d://myDir"));
- Process p = pb.start();
- //将要执行的Windows命令写入
- BufferedWriter bw=new BufferedWriter(newOutputStreamWriter(p.getOutputStream()));
- //'/r/n'是必须写入的
- bw.write("test.bat /r/n");
- bw.write("ping -t www.yahoo.com.cn /r/n");
- //flush()方法是必须调用的
- bw.flush();
- //将执行结果打印显示
- InputStream is = p.getInputStream();
- InputStreamReader isr = new InputStreamReader(is, "GBK");
- BufferedReader br = new BufferedReader(isr);
- String line;
- while ((line = br.readLine()) != null)
- {
- System.out.println(line);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public static void main(String[] args){
- List<String> address = UsingProcessBuilder.getPhysicalAddress();
- for(String add : address){
- System.out.printf("物理网卡地址: %s%n",add);
- }
- executeMyCommand1();
- executeMyCommand2();
- }
- }
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html
JDK5.0特性,使用ProcessBuilder执行本地命令的更多相关文章
- 7.使用ProcessBuilder执行本地命令(转)
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...
- ProcessBuilder执行本地命令
/**关键技术剖析 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 * ProcessBuilder的envi ...
- JDK5.0 特性-线程任务执行架构 ScheduledExecutorService
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...
- JAVA中ProcessBuilder执行cmd命令找不到路径的解决方法
今天遇到了一个很奇葩的问题,终于解决了,记一下,以做备忘. 前提条件:工程路径在D盘下 cmd要执行的可执行文件路径不在D盘下 然后...出事了............................ ...
- JDK5.0 特性-线程锁Lock
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...
- JDK5.0特性-线程 Callable和Future
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...
- JDK5.0 特性 监控与管理虚拟机
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...
- JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue
来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
随机推荐
- UEFI引导模式
Author: JinDate: 20140827System: windows 刚帮楼下的公司解决了个问题. 原来的办公电脑,预装linux,他们重装成win7.新买的电脑预装成win8,安装出问题 ...
- 如何在ubuntu安装phpstorm
第一步:使用组合键ctrl+alt+t 打开Terminal,cd /home/xxx(当前登录用户名)/downloads(下载目录) 第二步:下载 phpstorm 附截止发文最新版本链接:htt ...
- WPF中的ImageBrush常用方式
WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush).使用图块画笔绘制区域涉及以下三个组成部分:内容.基本图块和输出区域.基本输出过程如下图所示: 其中, ...
- BZOJ 1500: [NOI2005]维修数列 (splay tree)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 4229 Solved: 1283[Submit][Status ...
- NDK开发环境搭建_r8
本文主内容: 1. Android NDK 安装 2. 安装Cygwin与使用NDK编译 3. 在Eclipse中集成C/C++开发环境CDT 4. 安装Sequoyah插件 5. JNI编 ...
- Kali Linux下安装配置ProFTPD实例
1.安装ProFTPD 在ftp://ftp.proftpd.org/下能够找到官方公布的各个ProFTPD版本号,本人使用ftp://ftp.proftpd.org/historic/source/ ...
- Spring3.2.3+Quartz2.2.1 整合配置
步骤: 1.下载相关包 quartz-2.2.1.jar quartz-jobs-2.2.1.jar spring相关jar包 2.编写配置文件静态 <bean id="activat ...
- 四边形优化dp
理解: http://blog.renren.com/share/263498909/1064362501 http://www.cnblogs.com/ronaflx/archive/2011/03 ...
- Java集合框架2
8. 枚举(Enum)使用示例 声明一个枚举类型的简单形式如下: 访问类型 enum 枚举类名{值1[,值2,......]}; 例8. 为枚举类添加辅助方法. package set; public ...
- Java中使用Jedis操作Redis之二
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.J ...