首页>JAVA>正文

Java获取本机MAC地址/IP地址/主机名_尚学堂java培训

时间:2018-05-16 15:54:51   来源:上海尚学堂   阅读:
今天小编给大家带来一项硬货,那就是如何通过Java获取本机MAC地址、IP地址、主机名。




一、第一种方法:


实现Java获取MAC地址/IP地址/主机名的功能。实现原理如下:

IP地址和主机名时直接调用java.net.InetAddress 这个类中的方法来实现的;而MAC地址,区分Windows和Unix两种操作系统,分别用"ipconfig /all"和"ifconfig eth0"命令来获取输出,然后对其进行解析,找到MAC地址的位置。如果操作系统的语言不同,解析里面的内容也时有差别的;另外如果网卡不是eth0, 也需要相应的修改,需要根据自己实际应用场景进行修改的。

实现代码如下:

 

1 package cn.com.sinosoft.monitor.vo;
  2 
  3         import java.io.BufferedReader;
  4         import java.io.IOException;
  5         import java.io.InputStreamReader;
  6         import java.net.InetAddress;
  7         import java.net.NetworkInterface;
  8         import java.net.UnknownHostException;
  9         import java.util.ArrayList;
 10         import java.util.List;
 11         import java.util.Map;
 12 
 13 /**
 14  * @className: SystemTool
 15  * @description: 与系统相关的一些常用工具方法. 目前实现的有:获取MAC地址、IP地址、主机名
 16  * @author: 上海尚学堂  shsxt.com
 17  * @createTime: 2018-5-16 15:03:44
 18  */
 19 public class Tool {
 20 
 21     /**
 22      * 获取当前操作系统名称.
 23      * return 操作系统名称 例如:windows xp,linux 等.
 24      */
 25     private static String getOSName() {
 26         return System.getProperty("os.name").toLowerCase();
 27     }
 28 
 29     /**
 30      * 获取unix网卡的mac地址.
 31      * 非windows的系统默认调用本方法获取.如果有特殊系统请继续扩充新的取mac地址方法.
 32      *
 33      * @return mac地址
 34      */
 35     private static String getUnixMACAddress() {
 36         String mac = null;
 37         BufferedReader bufferedReader = null;
 38         Process process;
 39         try {
 40             process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
 41             bufferedReader = new BufferedReader(new InputStreamReader(process
 42                     .getInputStream()));
 43             String line;
 44             int index;
 45             while ((line = bufferedReader.readLine()) != null) {
 46                 index = line.toLowerCase().indexOf("hwaddr");// 寻找标示字符串[hwaddr]
 47                 if (index >= 0) {// 找到了
 48                     mac = line.substring(index + "hwaddr".length() + 1).trim();//  取出mac地址并去除2边空格
 49                     break;
 50                 }
 51             }
 52         } catch (IOException e) {
 53             e.printStackTrace();
 54         } finally {
 55             try {
 56                 if (bufferedReader != null) {
 57                     bufferedReader.close();
 58                 }
 59             } catch (IOException e1) {
 60                 e1.printStackTrace();
 61             }
 62         }
 63 
 64         return mac;
 65     }
 66 
 67     /**
 68      * 获取widnows网卡的mac地址.
 69      *
 70      * @return mac地址
 71      */
 72     private static List<String> getWindowsMACAddress() {
 73         List<String> macList = new ArrayList<String>();
 74         String mac = null;
 75         BufferedReader bufferedReader = null;
 76         Process process;
 77         try {
 78             // windows下的命令,显示信息中包含有mac地址信息
 79             process = Runtime.getRuntime().exec("ipconfig /all");
 80             bufferedReader = new BufferedReader(new InputStreamReader(process
 81                     .getInputStream(),"GBK"));
 82             String line;
 83             int index;
 84             while ((line = bufferedReader.readLine()) != null) {
 85                 index = line.toLowerCase().indexOf("physical address");// 寻找标示字符串[physical address]
 86 
 87                 if (index == -1) {
 88                     index = line.indexOf("物理地址");
 89                 }
 90                 if (index >= 0) {// 找到了
 91                     index = line.indexOf(":");// 寻找":"的位置
 92                     if (index >= 0) {
 93                         mac = line.substring(index + 1).trim();//  取出mac地址并去除2边空格
 94                     }
 95                     macList.add(mac);
 96                 }
 97             }
 98 
 99         } catch (IOException e) {
100             e.printStackTrace();
101         } finally {
102             try {
103                 if (bufferedReader != null) {
104                     bufferedReader.close();
105                 }
106             } catch (IOException e1) {
107                 e1.printStackTrace();
108             }
109         }
110 
111         return macList;
112     }
113 
114     /**
115      * @return 本机主机名
116      */
117     private static String getHostName() {
118         InetAddress ia = null;
119         try {
120             ia = InetAddress.getLocalHost();
121         } catch (UnknownHostException e) {
122             e.printStackTrace();
123         }
124         if (ia == null) {
125             return "some error..";
126         } else
127             return ia.getHostName();
128     }
129 
130     /**
131      * @return 本机IP 地址
132      */
133     private static String getIPAddress() {
134         InetAddress ia = null;
135         try {
136             ia = InetAddress.getLocalHost();
137         } catch (UnknownHostException e) {
138             e.printStackTrace();
139         }
140         if (ia == null) {
141             return "some error..";
142         } else
143             return ia.getHostAddress();
144     }
145 
146     /**
147      * 测试用的main方法.
148      *
149      * @param argc 运行参数.
150      */
151     public static void main(String[] argc) {
152         String os = getOSName();
153         System.out.println("OS Type:" + os);
154         if (os.contains("windows")) {
155             //本地是windows
156             List<String> mac = getWindowsMACAddress();
157             System.out.println("MAC Address:" + mac);
158         } else {
159             //本地是非windows系统 一般就是unix
160             String mac = getUnixMACAddress();
161             System.out.println(mac);
162         }
163         System.out.println("HostName:" + getHostName());
164         System.out.println("IPAddress:" + getIPAddress());
165 
166 
167         //这个更简单
168         Map<String, String> map = System.getenv();
169         String userName = map.get("USERNAME");// 获取用户名
170         String computerName = map.get("COMPUTERNAME");// 获取计算机名
171         String userDomain = map.get("USERDOMAIN");// 获取计算机域名
172 
173 
174         System.out.println(userName);
175         System.out.println(computerName);
176         System.out.println(userDomain);
177 
178         System.out.println(GetMac());
179     }
180 
181     static String GetMac(String... ip)
182     {
183         List<String> macList = new ArrayList<String>();
184         InetAddress ia;
185         byte[] mac = null;
186         try {
187             //获取本地IP对象
188             ia = InetAddress.getLocalHost();
189             //获得网络接口对象(即网卡),并得到mac地址,mac地址存在于一个byte数组中。
190             mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();
191         } catch (Exception e) {
192             e.printStackTrace();
193         }
194         //下面代码是把mac地址拼装成String
195         StringBuffer sb = new StringBuffer();
196         for(int i=0;i<mac.length;i++){
197             if(i!=0){
198                 sb.append("-");
199             }
200             //mac[i] & 0xFF 是为了把byte转化为正整数
201             String s = Integer.toHexString(mac[i] & 0xFF);
202             sb.append(s.length()==1?0+s:s);
203         }
204 
205         //把字符串所有小写字母改为大写成为正规的mac地址并返回
206         return sb.toString().toUpperCase();
207     }
208 
209 }



二、另外一种方法:

java获取计算机本地的信息基本靠 Properties props=System.getProperties();

package com.javaer.examples;
 
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Formatter;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
 
public class GetInfo {
 
/**
* windows和Linux,mac下结果不一样
*/
public static void getIpconfig(){
       Map< String,String> map = System.getenv();
       System.out.println(map);
 
       /*windows*/
       System.out.println(map.get("USERNAME"));//获取用户名
       System.out.println(map.get("COMPUTERNAME"));//获取计算机名
       System.out.println(map.get("USERDOMAIN"));//获取计算机域名
 
       /*mac*/
       System.out.println(map.get("USER"));
   }
 
/**
 * Java的运行环境版本:1.6.0_33
Java的运行环境供应商:Apple Inc.
Java供应商的URL:http://www.apple.com/
Java的安装路径:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Java的虚拟机规范版本:1.0
Java的虚拟机规范供应商:Sun Microsystems Inc.
Java的虚拟机规范名称:Java Virtual Machine Specification
Java的虚拟机实现版本:20.8-b03-424
Java的虚拟机实现供应商:Apple Inc.
Java的虚拟机实现名称:Java HotSpot(TM) 64-Bit Server VM
Java运行时环境规范版本:1.6
Java运行时环境规范供应商:null
Java运行时环境规范名称:Java Platform API Specification
Java的类格式版本号:50.0
Java的类路径:/Users/mc2/WEB/JSP/Javaer/bin:/Users/mc2/WEB/JSP/Javaer/lib/mongo-2.9.0-RC2.jar:/Users/mc2/WEB/JSP/Javaer/lib/bbCommon1.2.jar:/Users/mc2/WEB/JSP/Javaer/lib/jedis-2.1.0.jar
加载库时搜索的路径列表:.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
默认的临时文件路径:/var/folders/-E/-EZ40U6QGn06ccbzahOZME+++TI/-Tmp-/
一个或多个扩展目录的路径:/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext
操作系统的名称:Mac OS X
操作系统的构架:x86_64
操作系统的版本:10.6.8
文件分隔符:/
路径分隔符::
行分隔符:
 
用户的账户名称:mc2
用户的主目录:/Users/mc2
用户的当前工作目录:/Users/mc2/WEB/JSP/Javaer
 
 */
//其它的一些东西,会有用到的时候的
   public static void all(){
       Properties props=System.getProperties();
       System.out.println("Java的运行环境版本:"+props.getProperty("java.version"));
       System.out.println("Java的运行环境供应商:"+props.getProperty("java.vendor"));
       System.out.println("Java供应商的URL:"+props.getProperty("java.vendor.url"));
       System.out.println("Java的安装路径:"+props.getProperty("java.home"));
       System.out.println("Java的虚拟机规范版本:"+props.getProperty("java.vm.specification.version"));
       System.out.println("Java的虚拟机规范供应商:"+props.getProperty("java.vm.specification.vendor"));
       System.out.println("Java的虚拟机规范名称:"+props.getProperty("java.vm.specification.name"));
       System.out.println("Java的虚拟机实现版本:"+props.getProperty("java.vm.version"));
       System.out.println("Java的虚拟机实现供应商:"+props.getProperty("java.vm.vendor"));
       System.out.println("Java的虚拟机实现名称:"+props.getProperty("java.vm.name"));
       System.out.println("Java运行时环境规范版本:"+props.getProperty("java.specification.version"));
       System.out.println("Java运行时环境规范供应商:"+props.getProperty("java.specification.vender"));
       System.out.println("Java运行时环境规范名称:"+props.getProperty("java.specification.name"));
       System.out.println("Java的类格式版本号:"+props.getProperty("java.class.version"));
       System.out.println("Java的类路径:"+props.getProperty("java.class.path"));
       System.out.println("加载库时搜索的路径列表:"+props.getProperty("java.library.path"));
       System.out.println("默认的临时文件路径:"+props.getProperty("java.io.tmpdir"));
       System.out.println("一个或多个扩展目录的路径:"+props.getProperty("java.ext.dirs"));
       System.out.println("操作系统的名称:"+props.getProperty("os.name"));
       System.out.println("操作系统的构架:"+props.getProperty("os.arch"));
       System.out.println("操作系统的版本:"+props.getProperty("os.version"));
       System.out.println("文件分隔符:"+props.getProperty("file.separator"));
       //在 unix 系统中是"/" 
       System.out.println("路径分隔符:"+props.getProperty("path.separator"));
       //在 unix 系统中是":" 
       System.out.println("行分隔符:"+props.getProperty("line.separator"));
      //在 unix 系统中是"/n"
       System.out.println("用户的账户名称:"+props.getProperty("user.name"));
       System.out.println("用户的主目录:"+props.getProperty("user.home"));
       System.out.println("用户的当前工作目录:"+props.getProperty("user.dir"));
   }
 
/**
* 得到计算机的ip,名称,操作系统名称,操作系统版本
     * 本机IP:127.0.0.1
本机名称:localhost
操作系统的名称:Mac OS X
操作系统的版本:10.6.8
     */
    public static void Config(){
        try{
            InetAddress addr = InetAddress.getLocalHost(); 
            String ip=addr.getHostAddress().toString(); //获取本机ip
            String hostName=addr.getHostName().toString(); //获取本机计算机名称
            System.out.println("本机IP:"+ip+"\n本机名称:"+hostName);
            Properties props=System.getProperties();
            System.out.println("操作系统的名称:"+props.getProperty("os.name"));
            System.out.println("操作系统的版本:"+props.getProperty("os.version")); 
        }catch(Exception e){
            e.printStackTrace();
        }
    }
 
 
 
    /**
     * 得到计算机的ip地址和mac地址<br />
     * IP:127.0.0.1<br />
* MAC:FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01
     */
    public static void getConfig(){
        try{
            InetAddress address = InetAddress.getLocalHost();
            NetworkInterface ni = NetworkInterface.getByInetAddress(address);
            //ni.getInetAddresses().nextElement().getAddress();
            byte[] mac = ni.getHardwareAddress();
            if(mac==null){
            mac = ni.getInetAddresses().nextElement().getAddress();
            }
 
            String sIP = address.getHostAddress();
            String sMAC = "";
            Formatter formatter = new Formatter();
            for (int i = 0; i < mac.length; i++) {
                sMAC = formatter.format(Locale.getDefault(), "%02X%s", mac[i],
                        (i < mac.length - 1) ? "-" : "").toString();
            }
            System.out.println("IP:" + sIP);
            System.out.println("MAC:" + sMAC);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GetInfo.all();
}
 
}

参考:https://java-er.com/blog/java-ip-mac-local/;
上海尚学堂java培训整理编辑,欢迎联系我们获取java相关资料和咨询。
推荐更多阅读:
Java多线程实现的四种方式以及优缺点_上海java培训》;
学好Java的4条秘诀_尚学堂Java培训总结》;
java学习路线,需要学习哪些知识点?如何成为java架构师》;
学Java必须要弄懂的几个问题,你看看你都会吗?

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫