千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
在我们在写程序的过程中,有些时候需要知道一些电脑的硬件信息,比如我们写一些需要注册的程序的时候,就需要得到某个电脑特定的信息,一般来说,网卡的物理地址是不会重复的,我们正好可以用它来做为我们识别一台电脑的标志.那如何得到网卡的物理地址呢?我们可以借助于ProcessBuilder这个类,这个类是JDK1.5新加的,以前也可以用Runtime.exce这个类.在此我们将演示一下如何在Windows和Linux环境下得到网卡的物理地址.

代码如下:
/*
 * Test.java
 *
 * Created on 2007-9-27, 9:11:15
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package test2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * 
@author hadeslee
 
*/
public class Test {

    
public static String getMACAddress() {

        String address 
= "";
        String os 
= System.getProperty("os.name");
        System.out.println(os);
        
if (os != null) {
            
if (os.startsWith("Windows")) {
                
try {
                    ProcessBuilder pb 
= new ProcessBuilder("ipconfig""/all");
                    Process p 
= pb.start();
                    BufferedReader br 
= new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String line;
                    
while ((line = br.readLine()) != null) {
                        
if (line.indexOf("Physical Address"!= -1) {
                            
int index = line.indexOf(":");
                            address 
= line.substring(index + 1);
                            
break;
                        }
                    }
                    br.close();
                    
return address.trim();
                } 
catch (IOException e) {
                    
                }
            }
else if(os.startsWith("Linux")){
                
try {
                    ProcessBuilder pb 
= new ProcessBuilder("ifconfig");
                    Process p 
= pb.start();
                    BufferedReader br 
= new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String line;
                    
while((line=br.readLine())!=null){
                        
int index=line.indexOf("硬件地址");
                        
if(index!=-1){
                            address
=line.substring(index+4);
                            
break;
                        }
                    }
                    br.close();
                    
return address.trim();
                } 
catch (IOException ex) {
                    Logger.getLogger(Test.
class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
        }
        
return address;
    }

    
public static void main(String[] args) {
        System.out.println(
"" + Test.getMACAddress());
    }
}


我们可以看一下1.5新增的ProcessBuilder这个类,这个类比起以前用Runtime.exec来说,要强大一些,它可以指定一个环境 变量,并指定程序运行时的目录空间,并且也可以得到程序运行时的环境变量.因为ipconfig这个命令已经是system32里面的,所以不需要我们另外再设环境变量或者指定程序的运行时目录空间.我们直接用就可以了,然后得到进程的输出流,就可以分析出我们所需要的东西了.是不是挺简单的呢:)

此程序可以得到windows下和Linux下的网卡地址,不过LINUX要是中文版的,英文版的也一样,只不过把字替换一下就可以了。这样我们的程序就有了两个平台的实现。



尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2007-09-27 09:22 千里冰封 阅读(4308) 评论(16)  编辑  收藏 所属分类: JAVASE

FeedBack:
# re: JAVA得到网卡物理地址
2007-09-27 10:31 | BeanSoft
支持一下的.  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 10:41 | zht
不错  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 11:11 | 冷面阎罗
对多个网卡只能读取一个来  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 11:28 | 千里冰封
呵呵,那是,对于多个的话,也可以使用命令一个一个得到  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 11:31 | t
貌似以前在哪见到过  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 11:33 | 千里冰封
是吗?
当然不可能就我一个人写得到网卡的地址了,别人也会写,但是实现的细节不一定一样  回复  更多评论
  
# re: JAVA得到网卡物理地址
2007-09-27 11:43 | t
实现的细节确实不一样,呵呵。  回复  更多评论
  
# re: JAVA得到网卡物理地址(window和Linux)[未登录]
2007-09-27 12:22 | 阿蜜果
恩,不错,不过个人觉得最好采用bat方式,通过java来调用bat,以后有改动容易点
我也使用过它来调用Windows和Linux的本地接口,可惜的是不跨平台。
有点麻烦  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-27 12:31 | 千里冰封
@阿蜜果
呵呵, bat只有WINDOWS下才有用,所以只能起动系统相关的进程了,呵呵,如果调用本地方法的话,还需要加一个dll或者so文件才能使用.:)欢迎经常来小屋坐坐  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)[未登录]
2007-09-27 12:50 | 阿蜜果
@ 千里冰封
这个我知道,呵呵,在Windows下用bat,Linux下用shell脚本,以后如果有什么改动应该容易点。一点建议:)
最近更新blog好勤快阿
嘻嘻  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-27 12:51 | 千里冰封
@阿蜜果
呵呵,那是,方便了一些,女生搞JAVA的不容易啊,以后还要多向你学习哦  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-27 13:10 | inx
这个程序靠字符串搜索获得MAC ADDRESS 太不可靠了;
要多考虑不同操作系统平台的, 还有中文/英文环境;
比如有的返回是
eth1 Link encap:Ethernet HWaddr 00:14:5E:e3:BE:2E

LZ 的程序就出错了  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-27 13:12 | 千里冰封
说得很好,我在程序里面也说了,我那个是中文LINUX的输出,如果是英文,把"硬件地址"改为"Ethernet HWaddr"就可以了,如果不这样的话,就只能调用本地方法直接获得了
  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-27 13:22 | 死循环
受教  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2007-09-30 16:22 | 1shou
我做的时候 是用 jni 写了一个 c++ 类,,读 取 网卡 MAC CPU ID 硬 盘编号,, 呵呵,,只是发现很不稳定。  回复  更多评论
  
# re: JAVA得到网卡物理地址(windows和Linux)
2013-04-27 14:53 | zdc
屁蛋,不用root权限无法得到正确的结果,你这程序和脚本编程有多大不同,还是用c/c++吧  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: