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执行本地命令
* 它提供的功能更加丰富,能够设置设置工作目录、环境变量等
* 本例ProcessBuilder执行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(new OutputStreamWriter(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://blog.csdn.net/qian_348840260/article/details/5200450

7.使用ProcessBuilder执行本地命令(转)的更多相关文章

  1. JDK5.0特性,使用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. JAVA中ProcessBuilder执行cmd命令找不到路径的解决方法

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

  4. 0 Linux下Java使用ProcessBuilder执行命令与直接Bash执行命令之间的不同(环境变量方面)

    0 问题发生 xiaojietest.java package tasks; import java.io.BufferedReader; import java.io.BufferedWriter; ...

  5. java中执行cmd命令

    一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...

  6. Linux远程执行Shell命令或脚本

    ## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...

  7. redis如何执行redis命令

    Redis 命令 Redis 命令用于在 redis 服务上执行操作.所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cm ...

  8. 在c++程序中执行DOS命令

    转自博客:http://blog.csdn.net/ypist/article/details/8485049 #1,system()方式 在C盘根目录下新建文件夹,名称为12: system(&qu ...

  9. Ubuntu 14.10 下SSH执行远程命令

    有些时候需要在远程机器上执行命令,如果每次都等进去挺麻烦的,所以用脚本执行会方便很多.下面介绍一下在shell脚本中执行远程命令. 1,首先写好要运行的脚本 run-command.sh, 加上执行权 ...

随机推荐

  1. Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了解拖拽的原理

    今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript&q ...

  2. 用正则表达式抓取网页中的ul 和 li标签中最终的值!

                获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1& ...

  3. 算法分析-动态规划(cut_rod)

    什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态. 当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法.暴力法等 ...

  4. ping-tool

    https://serve.netsh.org/pub/ping-tool/ https://serve.netsh.org/pub/ipv4-hosts/

  5. java--工具方法

    根据时间戳得到具体的时间: public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat(& ...

  6. docker 配置桥接网络

    2.5 docker配置桥接网络(上): 为了使本地网络中的机器和Docker 容器更方便的通信,我们经常会有将Docker容器 配置到和主机同一网段的需求. 这个需求其实很容器实现, 我们只需要将D ...

  7. VS2005设置Release模式可调试

    from:http://www.cppblog.com/fwxjj/archive/2009/09/25/97219.html

  8. break point

    结论: 当有break point时,$m_H(N)=O(N^{k-1})$ bounding function:当break point = k,时成长函数$m_H(N)$的上限这样可以忽略假设集的 ...

  9. user Collaborative Filtering

    ---恢复内容开始--- 算法步骤: 1.计算用户相似度 2.对于特定用户,选出k个最相似的用户,将这些用户评价过的前k好的物品推荐给该用户   用户相似度 度量: 其中|N(u)|表示用户u评价过的 ...

  10. Genealogical tree(拓扑结构+邻接表+优先队列)

    Genealogical tree Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) ...