运行命令" cmd ipconfig /all"就会出现以下结果
Physical Address. . . . . . . . . : 20-CF-30-9A-60-EE
。
java就能过这样的命令来获取。以下是示例。
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
public class TestMac
{
public static void main(String[] args) {
System.out.println("Operation System=" + getOsName())
System.out.println("Mac Address=" + getMACAddress())
System.out.println("通过ip获取mac"+getMACAddress("192.168.1.101"))
}
public static String getOsName() {
String os = ""
os = System.getProperty("os.name")
return os
}
public static String getMACAddress() {
String address = ""
String os = getOsName()
if (os.startsWith("Windows")) {
try {
String command = "cmd.exe /c ipconfig /all"
Process p = Runtime.getRuntime().exec(command)
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))
String line
while ((line = br.readLine()) != null) {
if (line.indexOf("Physical Address") >0) {
int index = line.indexOf(":")
index += 2
address = line.substring(index)
break
}
}
br.close()
return address.trim()
} catch (IOException e) {
}
} else if (os.startsWith("Linux")) {
String command = "/bin/sh -c ifconfig -a"
Process p
try {
p = Runtime.getRuntime().exec(command)
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))
String line
while ((line = br.readLine()) != null) {
if (line.indexOf("HWaddr") >0) {
int index = line.indexOf("HWaddr") + "HWaddr".length()
address = line.substring(index)
break
}
}
br.close()
} catch (IOException e) {
}
}
address = address.trim()
return address
}
public static String getMACAddress(String ipAddress) {
String str = "", strMAC = "", macAddress = ""
try {
Process pp = Runtime.getRuntime().exec("nbtstat -a " + ipAddress)
InputStreamReader ir = new InputStreamReader(pp.getInputStream())
LineNumberReader input = new LineNumberReader(ir)
for (int i = 1i <100i++) {
str = input.readLine()
if (str != null) {
if (str.indexOf("MAC Address") >1) {
strMAC = str.substring(str.indexOf("MAC Address") + 14,
str.length())
break
}
}
}
} catch (IOException ex) {
return "Can't Get MAC Address!"
}
//
if (strMAC.length() <17) {
return "Error!"
}
macAddress = strMAC.substring(0, 2) + ":" + strMAC.substring(3, 5)
+ ":" + strMAC.substring(6, 8) + ":" + strMAC.substring(9, 11)
+ ":" + strMAC.substring(12, 14) + ":"
+ strMAC.substring(15, 17)
//
return macAddress
}
}
剑天梦的回答原理和我这个一样,都是通过Process 执行命令。 我直接补充到答案里了。不过
我这边运行那个命令出来的结果很多,那么花的时间就长了。优点是能够获取别人的mac地址 。
本方法主要用来限制系统在其他的机器上运行 其实原理简单的很 没有调用第三方插件 代码如下:
package users util
import java io *
import java util *
import java util regex *
public class NetID {
String IPCONFIG_MAND_WIN = ipconfig /all
boolean realMac = true
String unique =
public static String getMacAddress() {
NetID hwid = new NetID()
return hwid getUnique() trim()
}
private String getUnique() {
String os = System getProperty( os name )
if (os startsWith( Windows )) {
return getUniqueWindows()
}else {
return
}
}
private String getUniqueWindows() {
String ipConfigResponse = null
try {
ipConfigResponse = runConsoleCommand(IPCONFIG_MAND_WIN)
}
catch (IOException e) {
e printStackTrace()
}
StringTokenizer tokenizer = new StringTokenizer(ipConfigResponse \n )
while (tokenizer hasMoreTokens()) {
String line = tokenizer nextToken() trim()
int macAddressPosition = line indexOf( : )
if (macAddressPosition <= ) {
continue
}
String macAddressCandidate = line substring(macAddressPosition + )
trim()
if (isMacAddWin(macAddressCandidate)) {
if (realMac == true) {
generateUnique(macAddressCandidate)
}
else {
realMac = true
}
}
}
return unique
}
private String runConsoleCommand(String mand) throws IOException {
Process p = Runtime getRuntime() exec(mand)
InputStream stdoutStream = new BufferedInputStream(p getInputStream())
StringBuffer buffer = new StringBuffer()
while (true) {
int c = stdoutStream read()
if (c == ) {
break
}
buffer append( (char) c)
}
String outputText = buffer toString()
stdoutStream close()
return outputText
}
private boolean isMacAddWin(String macAddressCandidate) {
Pattern macPattern = pile( [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } )
Matcher m = macPattern matcher(macAddressCandidate)
return m matches()
}
private boolean isMacAddOSX(String macAddressCandidate) {
if (macAddressCandidate length() != ) {
return false
}
else {
return true
}
}
private void generateUnique(String macAddress) {
if (unique == ) {
unique += macAddress
}
else {
unique += #
unique += macAddress
}
}
public static void main(String [] args) {
System out println(NetID getMacAddress())
}
lishixinzhi/Article/program/Java/hx/201311/25985首先,创建工程,包,和一个类。
在此不加详述,我们直接看代码。
这里,我把这个类命名为GetMacAddr
这里,最最关键的就是这里这个方法。
我们通过NetworkInterface这个类来操作。
也就是通过getLocalHost()方法先得到本机IP,
然后调用getHardwareAddress()方法得到一个byte数组的地址。
我们把六位地址传到一个byte数组里面,然后输出来就是。
不多废话,看代码:
private void getMACAddr()
throws SocketException, UnknownHostException {
// 获得IP
NetworkInterface netInterface =
NetworkInterface.getByInetAddress(InetAddress.getLocalHost())
// 获得Mac地址的byte数组
byte[] macAddr = netInterface.getHardwareAddress()
System.out.print("MAC Addr:\t")
// 循环输出
for (byte b : macAddr) {
// 这里的toHexString()是自己写的格式化输出的方法,见下步。
System.out.print(toHexString(b) + " ")
}
}
上一步骤中,为什么会出现一个toHexString()方法呢?
因为可能10进制转16进制时候可能会出现单字符,
所以,如果有出现单字符的情况,我们在其前面添加一个“0”做占位符。
这也是为了视觉的直观,也夹带着个人的习惯。
private static String toHexString(int integer) {
// 将得来的int类型数字转化为十六进制数
String str = Integer.toHexString((int) (integer &0xff))
// 如果遇到单字符,前置0占位补满两格
if (str.length() == 1) {
str = "0" + str
}
return str
}