⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usingprocessbuilder.java

📁 jdkJDK实例宝典源码讲解了java中各种类的使用和语法规则
💻 JAVA
字号:
package book.j2se5;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * 通过ProcessBuilder执行本地命令。此类用于创建操作系统进程。
 * 获取本机的MAC地址
 * 
 * 每个进程生成器管理这些进程属性:
 * (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 List<String> getPhysicalAddress() {
		Process p = null;
		//物理网卡列表 
		List<String> address = new ArrayList<String>();

		try {
			//执行ipconfig /all命令 
			p = new ProcessBuilder("ipconfig", "/all").start();
		} catch (IOException e) {
			return address;
		}
		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) {
			}
		}
		//以下分析输出值,得到物理网卡 
		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下,并且需要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();
			// do something
		} catch (IOException e) {
		} catch (InterruptedException e) {
		}
		return true;
	}
	
	public static void main(String[] args) {
		List<String> address = UsingProcessBuilder.getPhysicalAddress();
		for (String add : address) {
			System.out.printf("物理网卡地址: %s%n", add);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -