• 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 = sb.toString();
    108 
    109               int i = rtValue.indexOf("Physical Address. . . . . . . . . :");
    110 
    111               while (i > 0){
    112 
    113                      rtValue = 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 something
    176 
    177                      }
    178 
    179                      InputStream sdin = p.getInputStream(); //获得进程实例的标准输出
    180 
    181                      //do something
    182 
    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               try
    200 
    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

  • 相关阅读:
    java 计算文件 md5值
    前端项目结构
    路由器下连接路由器教程
    idea 中抽取部分代码
    idea 多行注释 Ctrl shift / 失效问题
    idea Ctrl+shift+F 快捷键失效原因
    Android studio 安装 jrebel for Android 下载不了问题
    利用C#创建和安装一个windows服务
    25条提高Visual Studio编码和调试效率的技巧
    IIS解决 上传文件大小限制
  • 原文地址:https://www.cnblogs.com/sunxucool/p/3842412.html
Copyright © 2020-2023  润新知