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执行本地命令的更多相关文章

  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. 批量替换url,指定内容不替换

    如果需要批量替换url的某几部分,当然是用正则了比如在CI框架中要把 <img src="pc/baidu/aa.jpg"> 替换成 <img src=" ...

  2. [转载] 使用Kettle进行数据迁移(ETL)

    由于开发新的系统,需要将之前一个老的C/S应用的数据按照新的数据设计导入到新库中.此过程可能涉及到表结构不一致.大数据量(千万级,甚至上亿)等情况,包括异构数据的抽取.清洗等等工作.部分复杂的工作需要 ...

  3. 华为S5300系列升级固件S5300SI-V100R006C00SPC800.cc

    这个固件附带了web,V100R005可以直接升级到这个版本,但没什么必要,因为V100R005本身可以直接升级到V200. 升级小插曲: 1.升级的使用使用Windows,不要用Mac或者Linux ...

  4. [Linux] tmux 终端复用命令行工具

    tmux 终端复用命令行工具 tmux 是一款终端复用命令行工具,通常用于 Terminal 的窗口管理.可以在终端软件重启后通过命令行恢复上次的 session. 安装运行 macOS 上使用 Ho ...

  5. Scramble String -- LeetCode

    原题链接: http://oj.leetcode.com/problems/scramble-string/  这道题看起来是比較复杂的,假设用brute force,每次做分割,然后递归求解,是一个 ...

  6. WordPress 客户端软件列表

    Windows: BlogDesk BlogJet Blog Writer Chrysanth WebStory Deepest Sender (Firefox或SeaMonkey扩展,跨平台- De ...

  7. Clever Little Box 电缆组件 USB A 插座 至 USB B 插头

    http://china.rs-online.com/web/p/usb-cable-assemblies/7244156/ 产品详细信息 USB3.0适配器 superspeed USB将提供10x ...

  8. 轨至轨运算放大器 rail to rail

    http://www.360doc.com/content/10/1102/16/2285160_66006645.shtml Rail to rail: 轨至轨,指器件的输入输出电压范围可以达到电源 ...

  9. Bootstrap 3之美05-排版、Button、Icon、Nav和NavBar、List、Table、Form

    本篇主要包括: ■  排版■  Button■  Icon■  Nav和NavBar■  List■  Table■  Form 排版 ● 斜体:<em>● 加粗体:<strong& ...

  10. MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片

    本篇通过在配置文件中设置,对上传图片修剪后保存到指定文件夹. 相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小  MVC文件上传02-使用HttpPostedFileB ...