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<String, String> 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); |
} |
} |