[java]代码库import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
/**
* 通过ProcessBuilder执行本地命令。此类用于创建操作系统进程。 获取本机的ip配置信息
*
* 每个进程生成器管理这些进程属性: (1)命令 是一个字符串列表,它表示要调用的外部程序文件及其参数(如果有) (2)环境 是从变量 到值
* 的依赖于系统的映射。初始值是当前进程环境的一个副本. (3)工作目录。默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名.
* (4)redirectErrorStream 属性。最初,此属性为 false, 意思是子进程的标准输出和错误输出被发送给两个独立的流, 这些流可以通过
* Process.getInputStream() 和 Process.getErrorStream() 方法来访问。 如果将值设置为
* true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。 在此情况下,合并的数据可从
* Process.getInputStream() 返回的流读取, 而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。
*/
public class UsingProcessBuilder {
/**
* 获取Windows系统下的网卡的MAC地址
*
* @return
*/
public static String getPhysicalAddress() {
Process p = null;
try {
// 执行ipconfig /all命令
p = new ProcessBuilder("ipconfig", "/all").start();
} catch (IOException e) {
return "";
}
byte[] b = new byte[1024];
int readbytes = -1;
StringBuffer sb = new StringBuffer();
// 读取进程输出值
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) {
}
}
return sb.toString();
}
/**
* 执行自定义的一个命令,该命令放在C:/temp下,并且需要2个环境变量的支持。
*/
public static boolean executeMyCommand() {
// 创建系统进程创建器
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
// 获得进程的环境
Map env = pb.environment();
// 设置和去除环境变量
env.put("VAR1", "myValue");
env.remove("VAR0");
env.put("VAR2", env.get("VAR1") + ";");
// 切换工作目录
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();
} catch (IOException e) {
} catch (InterruptedException e) {
}
return true;
}
public static void main(String[] args) {
String address = UsingProcessBuilder.getPhysicalAddress();
System.out.println(address);
}
}