首页 > 代码库 > JDK5.0特性,使用ProcessBuilder执行本地命令
JDK5.0特性,使用ProcessBuilder执行本地命令
1 import java.io.BufferedReader; 2 3 import java.io.BufferedWriter; 4 5 import java.io.File; 6 7 import java.io.IOException; 8 9 import java.io.InputStream; 10 11 import java.io.InputStreamReader; 12 13 import java.io.OutputStreamWriter; 14 15 import java.util.ArrayList; 16 17 import java.util.Arrays; 18 19 import java.util.Iterator; 20 21 import java.util.List; 22 23 import java.util.Map; 24 25 26 27 /** 28 29 * 在J2SE5.0之前使用Runtime的exec方法执行本地命令. 30 31 * 在J2Se5.0之后,可以使用ProcessBuilder执行本地命令 32 33 * 它提供的功能更加丰富,能够设置设置工作目录、环境变量等 34 35 * 本例PorcessBuilder执行Windows操作系统的"ipconfig/all"命令,获取本机网卡的MAC地址 36 37 */ 38 39 /**关键技术剖析 40 41 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 42 43 * ProcessBuilder的environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量 44 45 * ProcessBuilder的directory方法切换工作目录 46 47 * Process的getInputStream方法获得进程的标准输出流,getErrorStream方法获得进程的错误输出流 48 49 */ 50 51 public class UsingProcessBuilder { 52 53 /**获取Windows系统下的网卡的MAC地址*/ 54 55 public static List<String> getPhysicalAddress(){ 56 57 Process p = null; 58 59 List<String> address = new ArrayList<String>(); //物理网卡列表 60 61 try{ 62 63 p = new ProcessBuilder("ipconfig","/all").start(); //执行ipconfig/all命令 64 65 }catch(IOException e){ 66 67 return address; 68 69 } 70 71 byte[] b = new byte[1024]; 72 73 int readbytes = -1; 74 75 StringBuffer sb = new StringBuffer(); 76 77 //读取进程输出值 78 79 //在JAVA IO中,输入输出是针对JVM而言,读写是针对外部数据源而言 80 81 InputStream in = p.getInputStream(); 82 83 try{ 84 85 while((readbytes = in.read(b)) != -1){ 86 87 sb.append(new String(b,0,readbytes)); 88 89 } 90 91 }catch(IOException e1){ 92 93 }finally { 94 95 try{ 96 97 in.close(); 98 99 }catch (IOException e2){100 101 }102 103 }104 105 //以下是分析输出值,得到物理网卡106 107 String rtValue =http://www.mamicode.com/ sb.toString();108 109 int i = rtValue.indexOf("Physical Address. . . . . . . . . :");110 111 while (i > 0){112 113 rtValue = http://www.mamicode.com/rtValue.substring(i +"Physical Address. . . . . . . . . :".length());114 115 address.add(rtValue.substring(1,18));116 117 i = rtValue.indexOf("Physical Address. . . . . . . . . :");118 119 }120 121 return address;122 123 }124 125 /**执行自定义的一个命令,该命令放在C:/temp下,并且需要两个环境变量的支持*/126 127 public static boolean executeMyCommand1(){128 129 //创建系统进程创建器130 131 ProcessBuilder pb = new ProcessBuilder("myCommand","myArg1","myArg2");132 133 Map<String, String> env = pb.environment(); //获得进程的环境134 135 //设置和去除环境变量136 137 env.put("VAR1", "myValue");138 139 env.remove("VAR0");140 141 env.put("VAR2", env.get("VAR1") + ";");142 143 //迭代环境变量,获取属性名和属性值144 145 Iterator it=env.keySet().iterator();146 147 String sysatt = null;148 149 while(it.hasNext())150 151 {152 153 sysatt = (String)it.next();154 155 System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));156 157 }158 159 pb.directory(new File("C:/temp"));160 161 try{162 163 Process p = pb.start(); //得到进程实例164 165 //等待进程执行完毕166 167 if(p.waitFor() != 0){168 169 //如果进程运行结果不为0,表示进程是错误退出的170 171 //获得进程实例的错误输出172 173 InputStream error = p.getErrorStream();174 175 //do something176 177 }178 179 InputStream sdin = p.getInputStream(); //获得进程实例的标准输出180 181 //do something182 183 }catch(IOException e){184 185 }catch(InterruptedException e){186 187 }188 189 return true;190 191 }192 193 public static void executeMyCommand2(){194 195 ProcessBuilder pb = null;196 197 String sysatt = null;198 199 try200 201 {202 203 //创建一个进程示例204 205 pb = new ProcessBuilder("cmd.exe");206 207 //获取系统参数并打印显示208 209 Map<String, String> env = pb.environment();210 211 Iterator it=env.keySet().iterator();212 213 while(it.hasNext())214 215 {216 217 sysatt = (String)it.next();218 219 System.out.println("System Attribute:"+sysatt+"="+env.get(sysatt));220 221 }222 223 //设置工作目录224 225 pb.directory(new File("d://myDir"));226 227 Process p = pb.start();228 229 //将要执行的Windows命令写入230 231 BufferedWriter bw=new BufferedWriter(newOutputStreamWriter(p.getOutputStream()));232 233 //‘/r/n‘是必须写入的 234 235 bw.write("test.bat /r/n");236 237 bw.write("ping -t www.yahoo.com.cn /r/n");238 239 //flush()方法是必须调用的240 241 bw.flush();242 243 //将执行结果打印显示244 245 InputStream is = p.getInputStream();246 247 InputStreamReader isr = new InputStreamReader(is, "GBK");248 249 BufferedReader br = new BufferedReader(isr);250 251 String line;252 253 while ((line = br.readLine()) != null)254 255 {256 257 System.out.println(line);258 259 }260 261 }262 263 catch (Exception e)264 265 {266 267 e.printStackTrace();268 269 }270 271 }272 273 public static void main(String[] args){274 275 List<String> address = UsingProcessBuilder.getPhysicalAddress();276 277 for(String add : address){278 279 System.out.printf("物理网卡地址: %s%n",add);280 281 }282 283 executeMyCommand1();284 285 executeMyCommand2();286 287 }288 289 }
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。