`
fresh_daily
  • 浏览: 15739 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java获取本地mac总结(摘录整理)

    博客分类:
  • j2ee
阅读更多
方法一:
import java.net.InetAddress;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.StringTokenizer;

public final class NetworkInfo {
    private final static String getMacAddress() throws IOException {
        String os = System.getProperty("os.name");
        try {
            if (os.startsWith("Windows")) {
                return windowsParseMacAddress(windowsRunIpConfigCommand());
            } else if (os.startsWith("Linux")) {
                return linuxParseMacAddress(linuxRunIfConfigCommand());
            } else {
                throw new IOException("unknown operating system:" + os);
            }
        } catch (ParseException ex) {
            ex.printStackTrace();
            throw new IOException(ex.getMessage());
        }
    }

    /* 
    *   Linux   stuff 
    */
    private final static String linuxParseMacAddress(String ipConfigResponse) throws ParseException {
        String localHost = null;
        try {
            localHost = InetAddress.getLocalHost().getHostAddress();
        } catch (java.net.UnknownHostException ex) {
            ex.printStackTrace();
            throw new ParseException(ex.getMessage(), 0);
        }

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

        while (tokenizer.hasMoreTokens()) {
            String line = tokenizer.nextToken().trim();
            boolean containsLocalHost = line.indexOf(localHost) >= 0;
            //   see   if   line   contains   IP   address 
            if (containsLocalHost && lastMacAddress != null) {
                return lastMacAddress;
            }
            //   see   if   line   contains   MAC   address 
            int macAddressPosition = line.indexOf("HWaddr");
            if (macAddressPosition <= 0)
                continue;

            String macAddressCandidate = line.substring(macAddressPosition + 6).trim();
            if (linuxIsMacAddress(macAddressCandidate)) {
                lastMacAddress = macAddressCandidate;
                continue;
            }
        }

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

    private final static boolean linuxIsMacAddress(String macAddressCandidate) {
        if (macAddressCandidate.length() != 17){
            return false;
        }
        return true;
    }

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

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

        stdoutStream.close();

        return outputText;
    }

    /* 
    *   Windows   stuff 
    */
    private final static String windowsParseMacAddress(String ipConfigResponse)
                                                                               throws ParseException {
        String localHost = null;
        try {
            localHost = InetAddress.getLocalHost().getHostAddress();
        } catch (java.net.UnknownHostException ex) {
            ex.printStackTrace();
            throw new ParseException(ex.getMessage(), 0);
        }

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

        while (tokenizer.hasMoreTokens()) {
            String line = tokenizer.nextToken().trim();
            //   see   if   line   contains   IP   address 
            if (line.endsWith(localHost) && lastMacAddress != null) {
                return lastMacAddress;
            }
            //   see   if   line   contains   MAC   address 
            int macAddressPosition = line.indexOf(":");
            if (macAddressPosition <= 0)
                continue;
            String macAddressCandidate = line.substring(macAddressPosition + 1).trim();
            if (windowsIsMacAddress(macAddressCandidate)) {
                lastMacAddress = macAddressCandidate;
                continue;
            }
        }

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

    private final static boolean windowsIsMacAddress(String macAddressCandidate) {
        if (macAddressCandidate.length() != 17){
            return false;
        }
        return true;
    }

    private final static String windowsRunIpConfigCommand() throws IOException {
        Process p = Runtime.getRuntime().exec("ipconfig /all ");
        InputStream stdoutStream = new BufferedInputStream(p.getInputStream());
        StringBuffer buffer = new StringBuffer();
        for (;;) {
            int c = stdoutStream.read();
            if (c == -1)
                break;
            buffer.append((char) c);
        }
        String outputText = buffer.toString();
        stdoutStream.close();
        return outputText;
    }

    /* 
    *   Main 
    */
    public final static void main(String[] args) {
        try {
            System.out.println("Network infos");

            System.out.println("Operating System:" + System.getProperty("os.name"));
            System.out.println("IP/Localhost:" + InetAddress.getLocalHost().getHostAddress());
            System.out.println("MAC Address:" + getMacAddress());
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

方法二:
在Unix/Linux 下通常只有root 用户才有执行ifconfig 命令的权限, 第一种方法中用调用ifconfig 命令的方法获取硬件地址可靠性不好, 普通用户无法正确获取硬件地址,该方法通过纯java的方式很好地解决了此问题
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

public class MyMac {
    public static void main(String[] args) {
        try {
            //枚举所有网络接口设备
            Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
            //循环处理每一个网络接口设备
            while (interfaces.hasMoreElements()) {
                NetworkInterface face = (NetworkInterface) interfaces.nextElement();
                //环回设备(lo)设备不处理
                if (!face.getName().equals("lo")) {
                    //显示当前网络接口设备显示名称
                    System.out.println("网卡显示名称:" + face.getDisplayName());
                    //显示当前设备内部名称
                    System.out.println(" 网卡设备名称:" + face.getName());
                    // 获取硬件地址
                    byte[] mac = face.getHardwareAddress();
                    System.out.println(" 硬件地址(MAC):" + bytes2mac(mac));
                }
            }
        } catch (SocketException se) {
            System.err.println("错误:" + se.getMessage());
        }
    }

    private static String bytes2mac(byte[] bytes) {
        //MAC 地址应为6 字节
        if (bytes.length != 6) {
            System.err.println("MAC 地址数据有错! ");
            return null;
        }
        StringBuffer macString = new StringBuffer();
        byte currentByte;
        for (int i = 0; i < bytes.length; i++) {
            //与11110000 作按位与运算以便读取当前字节高4 位
            currentByte = (byte) ((bytes[i] & 240) >> 4);
            macString.append(Integer.toHexString(currentByte));
            //与00001111 作按位与运算以便读取当前字节低4 位
            currentByte = (byte) ((bytes[i] & 15));
            macString.append(Integer.toHexString(currentByte));
            //追加字节分隔符“-”
            macString.append("-");
        }
        //删除多加的一个“-”
        macString.delete(macString.length() - 1, macString.length());
        //统一转换成大写形式后返回
        return macString.toString().toUpperCase();
    }
}
分享到:
评论

相关推荐

    《Java与模式 阎宏 摘录》.doc 更新中……

    《Java与模式 阎宏 摘录》是一本深度探讨Java编程语言与设计模式的书籍,由著名IT专家阎宏所著。这本书旨在帮助Java开发者深入理解面向对象设计原则,掌握并应用各种设计模式,提升软件开发的效率和质量。通过摘录,...

    2020年最新Java核心知识点整理.pdf

    标题为《2020年最新Java核心知识点整理》,描述为对Java基础到进阶的全部学习资料进行整理,这些内容旨在提供给Java学习者,帮助他们系统性地掌握Java编程。文件还特别提到了JVM(Java虚拟机)以及GC(垃圾回收)等...

    传播学原理知识点个人从老师PPT上摘录整理.doc

    传播学原理知识点个人从老师PPT上摘录整理.doc

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA SE阶段重点知识总结Xmind格式文件

    本人根据自己学习的经验,将JAVA SE阶段的大部分重点知识摘录出来,放在Xmind思维导图中。希望可以对新人起到帮助效果

    Google Datastore for Java 文档摘录(四)

    **Google Datastore for Java 文档摘录(四)** 在这一部分,我们将深入探讨Google Datastore,这是一个在Java环境中使用的云数据库服务。Google Datastore是一个NoSQL文档数据库,提供了高可用性和可扩展性,适用...

    java免费下载资源网站

    - 阅读.pdf:可能包含技术文章、论文或书籍摘录,帮助深入理解和掌握Java及相关技术。 - 艺术.pdf:虽然看似不直接相关,但设计原则和用户体验在软件开发中也很重要。 - 关注科帮网获取更多源码.url:这是一个网址...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    webservice摘录webservice摘录

    webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录质

    Google Datastore for Java 文档摘录(一)

    《Google Datastore for Java 文档摘录(一)》 Google Datastore 是 Google 提供的一种分布式、高可扩展性、持久化的数据存储服务,它属于 Google Cloud Platform (GCP) 的一部分。对于 Java 开发者而言,Google ...

    Java IO流.xmind

    Java IO流思维导图,主要摘录整理的是java.io.*包下的所有IO对象,其中对应备注里包含各个IO对象的构造方法

    ACE摘录&总结

    ACE,全称Adaptive Communication Environment,是一个强大的C++跨平台框架工具,专为通信软件的开发设计。它包含了丰富的组件,旨在提升并发性、效率、可靠性和可移植性。ACE的核心功能包括进程间通信(IPC)、...

    英文版JAVA学习教程

    根据提供的文件信息,我们可以从中提炼出关于Java Servlet API Specification的相关知识点。下面将详细介绍这些知识点。 ### Java Servlet API Specification概述 #### 版本信息 - **版本号:** 2.4 - **状态:** ...

    Java 11 语言规范文档

    在Java语言规范中,提到了var关键字的使用,这是在Java 10中引入的一个新的本地变量类型推断特性,也在Java 11中得到支持。该关键字允许编译器根据初始化表达式推断变量的类型,使代码更加简洁。 文档中提及了不同...

    j2ee总结的经验(网络摘录)

    针对要面试java的兴趣者,一些比较经典的问题来的!

    单例设计模式个人总结+摘录

    - **定义**:利用Java的类加载机制来实现单例模式。 - **实现**:将单例对象放在静态内部类中,只有当外部类的方法被调用时才会加载内部类,从而创建实例。 - **特点**:线程安全,支持延迟加载,且无需使用`...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    Think-in-JAVA-4th-Edition

    ### 《Think-in-JAVA-4th-Edition》核心知识点概览 #### 一、书籍简介 《Thinking in Java》是一本由Bruce Eckel撰写的经典Java编程书籍,被誉为是学习Java的最佳参考资料之一。该书适合具有一定Java基础的学习者...

    Thinking in java 高清版(可直接复制源程序)

    ### Thinking in Java 高清版知识点总结 #### 一、书籍概述 《Thinking in Java》是一本由Bruce Eckel撰写的经典Java编程书籍。本书旨在为读者提供从基础到高级的全面Java编程知识体系,适合从初学者到具有一定...

Global site tag (gtag.js) - Google Analytics