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 ...
随机推荐
- hierarchyid有关的一些函数
于hierarchyid有关的一些函数主要有: GetAncestor :取得某一个级别的祖先 GetDescendant :取得某一个级别的子代 GetLevel :取得级别 ...
- LINUX 性能工具使用
http://xuclv.blog.51cto.com/5503169/1184517
- 【Android开发学习46】Android平台切割PNG图片成小png图片
功能描写叙述: 分解 assets 文件夹文件下的 PNG 图片成 各个小尺寸 PNG 图片 . 主函数运行: // 创建文件夹, 用来保存分解出来的图片 createPath("/sdca ...
- msgpack传文件
msgpack传文件 procedure TForm1.Button1Click(Sender: TObject);var ms, ms2: TMemoryStream; pack: TSimpleM ...
- amfphp2.1.1的使用经过
这两天看了一个FLASH的教程,是arrowyong写的名为 <<ActionScript3.0从零基础学习类>>,这个教程好用,没有ActionScript编程经验的人,可以 ...
- 在没有界面的类中,实现弹出UIAlertView || 在没有界面的类中,刷新程序界面 思路
+(DisplayErrorMsg *)sharedDisplayErrorMsg { static DisplayErrorMsg *instance = nil; @synchronized(in ...
- 在Windows Phone项目中调用C语言DLL
在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的 ...
- Java 中的 int 与 Integer 用于 List<Integer> 时,以及通过打印变量检測程序执行和函数调用次数计数
总结一下近期做的东西中遇到的问题 1. Java 中的 int 与 Integer 用于 List<Integer> 时 两者之间的关系都是非常清楚的.int 是基本数据类型,存储的是值 ...
- [Oracle] Insert All的妙用
无条件的插入 Oracle中的insert all是指把同一批数据插入到不同的表中,假如如今有个需求:把t表中的数据分别插入t1,t2,假设你不知道insert all,你可能会使用insert插入2 ...
- Fine Uploader + Spring3.2.2(Java+html5上传) SpringMVC+jquery-fineuploader 文件上传
需求:要实现多文件上传,且要支持手机等移动设备... springmvc文件上传真头疼,网上搜了半天没发现都是TMD的用submit按钮提交到后台的,就没有插件的吗?最后发现了fineUploader ...