Posted on 2007-10-12 14:07 
诗特林 阅读(3083) 
评论(4)  编辑  收藏  所属分类: 
Java 
			 
			
		 
		
前阵子看到一篇文件,
JAVA得到网卡物理地址(windows和Linux) ,当时觉得挺好,后来正好项目里有需要,就用了它,但好像有点问题.因为它是采用固定字符串搜索(
if (line.indexOf("Physical Address") != -1) )获得MAC 地址的,后来在应用时出了问题,因为没有"
Physical Address"这一项.后来在外网在查查了一下,后来发现老外有写一个这样的类,可能那样的方式更加可靠一点.算是做个标记.
 package sterning.queue;
package sterning.queue;
 import java.net.InetAddress;
import java.net.InetAddress;
 import java.io.InputStream;
import java.io.InputStream;
 import java.io.BufferedInputStream;
import java.io.BufferedInputStream;
 import java.io.IOException;
import java.io.IOException;
 import java.text.ParseException;
import java.text.ParseException;
 import java.util.StringTokenizer;
import java.util.StringTokenizer;



 public final class NetworkUtils
public final class NetworkUtils  {
{

 private final static int MACADDR_LENGTH = 17;
  private final static int MACADDR_LENGTH = 17;
 private final static String WIN_OSNAME = "Windows";
  private final static String WIN_OSNAME = "Windows";
 private final static String WIN_MACADDR_REG_EXP =
  private final static String WIN_MACADDR_REG_EXP =
 "^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$";
   "^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$";
 private final static String WIN_MACADDR_EXEC = "ipconfig /all";
  private final static String WIN_MACADDR_EXEC = "ipconfig /all";



 public final static String getMacAddress() throws IOException
  public final static String getMacAddress() throws IOException  {
{
 String os = System.getProperty("os.name");
    String os = System.getProperty("os.name");

 try
    try  {
{

 if (os.startsWith(WIN_OSNAME))
      if (os.startsWith(WIN_OSNAME))  {
{
 return winMacAddress(winIpConfigCommand());
         return winMacAddress(winIpConfigCommand());
 }
      }
 // 下面是其它的操作系统的代码,省略了!
      // 下面是其它的操作系统的代码,省略了!
 //   LINUX -->    else if (os.startsWith("Linux")) {
      //   LINUX -->    else if (os.startsWith("Linux")) { 
 //
      //                
 //                Process p = Runtime.getRuntime().exec("ifconfig");
      //                Process p = Runtime.getRuntime().exec("ifconfig");
 //   MAC OSX -->  else if(os.startsWith("Mac OS X")) {
      //   MAC OSX -->  else if(os.startsWith("Mac OS X")) { 
 //
      //                
 //                Process p = Runtime.getRuntime().exec("ifconfig");
      //                Process p = Runtime.getRuntime().exec("ifconfig");

 else
      else  {
{
 throw new IOException("OS not supported : " + os);
         throw new IOException("OS not supported : " + os);
 }
      }
 }
    }

 catch(ParseException e)
    catch(ParseException e)  {
{
 e.printStackTrace();
      e.printStackTrace();
 throw new IOException(e.getMessage());
      throw new IOException(e.getMessage());
 }
    }
 }
  }

 private final static String winMacAddress(String ipConfigOutput)
  private final static String winMacAddress(String ipConfigOutput) 

 throws ParseException
        throws ParseException  {
{
 String localHost = null;
    String localHost = null;

 try
    try  {
{
 localHost = InetAddress.getLocalHost().getHostAddress();
      localHost = InetAddress.getLocalHost().getHostAddress();
 }
    }

 catch(java.net.UnknownHostException ex)
    catch(java.net.UnknownHostException ex)  {
{
 ex.printStackTrace();
      ex.printStackTrace();
 throw new ParseException(ex.getMessage(), 0);
      throw new ParseException(ex.getMessage(), 0);
 }
    }

 StringTokenizer tokenizer = new StringTokenizer(ipConfigOutput, "\n");
    StringTokenizer tokenizer = new StringTokenizer(ipConfigOutput, "\n");
 String lastMacAddress = null;
    String lastMacAddress = null;


 while(tokenizer.hasMoreTokens())
    while(tokenizer.hasMoreTokens())  {
{
 String line = tokenizer.nextToken().trim();
      String line = tokenizer.nextToken().trim();

 // see if line contains IP address
      // see if line contains IP address

 if (line.endsWith(localHost) && lastMacAddress != null)
      if (line.endsWith(localHost) && lastMacAddress != null)  {
{
 return lastMacAddress;
         return lastMacAddress;
 }
      }

 // see if line contains MAC address
      // see if line contains MAC address
 int macAddressPosition = line.indexOf(":");
      int macAddressPosition = line.indexOf(":");
 if(macAddressPosition <= 0) continue;
      if(macAddressPosition <= 0) continue;

 String macAddressCandidate = line.substring(macAddressPosition + 1).trim();
      String macAddressCandidate = line.substring(macAddressPosition + 1).trim();

 if (winIsMacAddress(macAddressCandidate))
      if (winIsMacAddress(macAddressCandidate))  {
{
 lastMacAddress = macAddressCandidate;
         lastMacAddress = macAddressCandidate;
 continue;
         continue;
 }
      }
 }
    }

 ParseException ex = new ParseException
    ParseException ex = new ParseException
 ("cannot read MAC address from [" + ipConfigOutput + "]", 0);
       ("cannot read MAC address from [" + ipConfigOutput + "]", 0);
 ex.printStackTrace();
    ex.printStackTrace();
 throw ex;
    throw ex;
 }
  }



 private final static boolean winIsMacAddress(String macAddressCandidate)
  private final static boolean winIsMacAddress(String macAddressCandidate)  {
{
 if (macAddressCandidate.length() != MACADDR_LENGTH)    return false;
    if (macAddressCandidate.length() != MACADDR_LENGTH)    return false;
 if (!macAddressCandidate.matches(WIN_MACADDR_REG_EXP)) return false;
    if (!macAddressCandidate.matches(WIN_MACADDR_REG_EXP)) return false;
 return true;
    return true;
 }
  }



 private final static String winIpConfigCommand() throws IOException
  private final static String winIpConfigCommand() throws IOException  {
{
 Process p = Runtime.getRuntime().exec(WIN_MACADDR_EXEC);
    Process p = Runtime.getRuntime().exec(WIN_MACADDR_EXEC);
 InputStream stdoutStream = new BufferedInputStream(p.getInputStream());
    InputStream stdoutStream = new BufferedInputStream(p.getInputStream());

 StringBuffer buffer= new StringBuffer();
    StringBuffer buffer= new StringBuffer();

 for (;;)
    for (;;)  {
{
 int c = stdoutStream.read();
       int c = stdoutStream.read();
 if (c == -1) break;
       if (c == -1) break;
 buffer.append((char)c);
          buffer.append((char)c);
 }
    }
 String outputText = buffer.toString();
    String outputText = buffer.toString();
 stdoutStream.close();
    stdoutStream.close();
 return outputText;
    return outputText;
 }
  }



 public final static void main(String[] args)
  public final static void main(String[] args)  {
{

 try
    try  {
{
 System.out.println("MAC ADDRESS");
      System.out.println("MAC ADDRESS");
 System.out.println("  OS          : "
      System.out.println("  OS          : " 
 + System.getProperty("os.name"));
         + System.getProperty("os.name"));
 System.out.println("  IP/Localhost: "
      System.out.println("  IP/Localhost: " 
 + InetAddress.getLocalHost().getHostAddress());
         + InetAddress.getLocalHost().getHostAddress());
 System.out.println("  MAC Address : "
      System.out.println("  MAC Address : " 
 + getMacAddress());
         + getMacAddress());
 }
    }

 catch(Throwable t)
    catch(Throwable t)  {
{
 t.printStackTrace();
      t.printStackTrace();
 }
    }
 }
  }
 }
}
