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

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html

JDK5.0特性,使用ProcessBuilder执行本地命令的更多相关文章

  1. 7.使用ProcessBuilder执行本地命令(转)

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...

  2. ProcessBuilder执行本地命令

    /**关键技术剖析 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 * ProcessBuilder的envi ...

  3. JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...

  4. JAVA中ProcessBuilder执行cmd命令找不到路径的解决方法

    今天遇到了一个很奇葩的问题,终于解决了,记一下,以做备忘. 前提条件:工程路径在D盘下 cmd要执行的可执行文件路径不在D盘下 然后...出事了............................ ...

  5. JDK5.0 特性-线程锁Lock

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...

  6. JDK5.0特性-线程 Callable和Future

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...

  7. JDK5.0 特性 监控与管理虚拟机

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...

  8. JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue

    来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...

  9. JDK5.0 特性-线程同步装置之Semaphore

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...

随机推荐

  1. UEFI引导模式

    Author: JinDate: 20140827System: windows 刚帮楼下的公司解决了个问题. 原来的办公电脑,预装linux,他们重装成win7.新买的电脑预装成win8,安装出问题 ...

  2. 如何在ubuntu安装phpstorm

    第一步:使用组合键ctrl+alt+t 打开Terminal,cd /home/xxx(当前登录用户名)/downloads(下载目录) 第二步:下载 phpstorm 附截止发文最新版本链接:htt ...

  3. WPF中的ImageBrush常用方式

    WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush).使用图块画笔绘制区域涉及以下三个组成部分:内容.基本图块和输出区域.基本输出过程如下图所示: 其中, ...

  4. BZOJ 1500: [NOI2005]维修数列 (splay tree)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4229  Solved: 1283[Submit][Status ...

  5. NDK开发环境搭建_r8

    本文主内容: 1.  Android NDK 安装 2.  安装Cygwin与使用NDK编译 3.  在Eclipse中集成C/C++开发环境CDT 4.  安装Sequoyah插件 5.  JNI编 ...

  6. Kali Linux下安装配置ProFTPD实例

    1.安装ProFTPD 在ftp://ftp.proftpd.org/下能够找到官方公布的各个ProFTPD版本号,本人使用ftp://ftp.proftpd.org/historic/source/ ...

  7. Spring3.2.3+Quartz2.2.1 整合配置

    步骤: 1.下载相关包 quartz-2.2.1.jar quartz-jobs-2.2.1.jar spring相关jar包 2.编写配置文件静态 <bean id="activat ...

  8. 四边形优化dp

    理解: http://blog.renren.com/share/263498909/1064362501 http://www.cnblogs.com/ronaflx/archive/2011/03 ...

  9. Java集合框架2

    8. 枚举(Enum)使用示例 声明一个枚举类型的简单形式如下: 访问类型 enum 枚举类名{值1[,值2,......]}; 例8. 为枚举类添加辅助方法. package set; public ...

  10. Java中使用Jedis操作Redis之二

    import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.J ...