分享
 
 
 

用纯JAVA语言编程读取MAC地址的实现

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

本文介绍如何在WindowXP/NT/2000环境中,编写纯java程序,执行外部命令ipCONFIG,并通过分析该命令的输入流而获得本机的MAC地址的编程方法。

1 引言

用Java编写的程序,可以很方便地运行在各种平台的环境。但在实际的开发过程中,有时不得不涉及一些底层的编程。比如为了防止软件盗用,我们希望软件只能在指定计算机上运行,所以需要程序读取该机区分于其它计算机的硬件特征,如MAC地址等。作为一种跨平台语言,给Java语言提出了挑战。本文正是针对该问题,提出一种直接用纯Java语言,读去MAC地址的编程方法。

我们知道,在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。该对象可执行外部命令、查可用内存等。而多数操作系统都提供有查询该机MAC地址的命令。如在Microsoft的操作系统中,命令IPCONFIG等。本文的思路是在程序中运行一个外部命令,将该命令的运行结果作为一个流(Stream),读取并分析之,进而实现获取MAC地址的目的。

2 Runtime类

在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。

一般不实例化一个Runtime对象。但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。Runtime 类的大多数方法是实例方法。

Runtime 对象的作用主要有:执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。

Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。

下面的例子演示了怎样使用Runtime 对象运行一个外部命令。

以下是引用片段:

PRocess process = Runtime.getRuntime().exec("cmd.exe /c dir");

process.waitFor();

Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。

上面的程序在运行时会执行dir命令。假如在Windows95/98下,命令格式可以写成"command.exe /c dir"。开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口。

方法exec还可以打开一个不可执行的程序,但该文件存在关联的应用程序。以打开一个Word文档Mydoc.doc文件为例,Java中可以有以下两种写法:

以下是引用片段:

exec(""cmd /E:ON /c start MyDoc.doc"");

exec(" c:Program FilesMicrosoft Officeofficewinword.exe .mydoc.doc");

在第一种方式中,被执行的命令是start Mydoc.doc,开关E:ON 指定DOS 命令处理器答应命令扩展,而start 命令会开启一个单独的窗口执行所提供的命令。

执行一个有标准输出的DOS命令,程序执行完后往往不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的原因可能是该命令的输出比较多,而运行窗口的输出缓冲区不够大。解决的办法是,利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出,在waitfor()命令之前读出该缓冲区的内容。以运行命令dir为例,典型的程序如下:

以下是引用片段:

String line;

Process process = Runtime.getRuntime().exec("cmd /c dir");

BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader(process.getInputStream()));

while ( (line = bufferedReader.readLine()) != -1) System. out.println(line);

process.waitFor( );

:3 Process

Runtime.exec方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。

抽象类Process封装了一个进程(process),一个正在执行的程序。它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。在抽象类Process中,主要包含了如下一些抽象方法。

InputStream getInputStream( ):返回一个从进程的out输出流中读输入的输入流。

OutputStream getOutputStream( ):返回一个从进程的in输入流中写输出的输出流。

int waitFor( ) throws InterruptedException:返回由进程返回的退出码。这个方法直到调用它的进程中止,才会返回。

4 程序编写

我们先来分析ipconfig/all的输出格式:

图1

从图1中我们看到MAC地址包含的行为:“ Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C”。为了找到MAC地址,我们一行一行读取字符,只要找到字符串“ Physical Address. . . . . . . . . :”,就可以找到MAC地址了。下面是实现的程序片段:

以下是引用片段:

Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");

BufferedReader bufferedReader =

new BufferedReader(new InputStreamReader (process.getInputStream()));

while ( (line=bufferedReader.readLine()) != null){

if(line.indexOf("Physical Address. . . . . . . . . :") != -1){

if(line.indexOf(":") != -1){

physicalAddress = line.substring(line.indexOf(":")+2);

在上面的程序中,为了读取命令输出的字符,利用子进程process生成了一个数据流缓冲区。

依据上面的代码,我们编写了一个类ReadMAC,见下面程序的源代码:

以下是引用片段:

import java.io.*;

public class ReadMAC {

public static String physicalAddress = "read MAC error!";

public ReadMAC() {

}

public static String checkPhysicalAddress(){

try{

String line;

Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

while ( (line=bufferedReader.readLine()) != null){

if(line.indexOf("Physical Address. . . . . . . . . :") != -1){

if(line.indexOf(":") != -1){

physicalAddress = line.substring(line.indexOf(":")+2);

break; //找到MAC,推出循环

}

}

}

process.waitFor();

}catch(Exception e){

e.printStackTrace();

}

return physicalAddress;

}

public static void main(String[] args) {

System.out.println("本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress());

}

}

编译运行该程序的输出结果如图2所示。

图2

由于每一台计算机的MAC地址都不同,所以该程序在不同计算机上运行结果都会不一样。

5 结束语

作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。

Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。

以上讨论的程序适合于Windows xp/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有