`

JAVA语言读取MAC地址(转)

    博客分类:
  • java
阅读更多
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()); 
  }
 
  }
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中我们看到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生成了一个数据流缓冲区。
5 结束语

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

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

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

分享到:
评论

相关推荐

    Java 2平台安全技术-结构,API设计和实现

    第2章 Java语言的基本安全特点 12 2.1 Java语言和平台 12 2.2 基本安全结构 13 2.3 字节代码验证和类型安全 14 2.4 签名应用小程序 15 2.5 关于安全错误及其修复的简要历史 16 第3章 JDK1.2安全结构 19 3.1 起源 19 ...

    JAVA 2平台安全技术-结构,API设计和实现

    第2章 Java语言的基本安全特点 12 2.1 Java语言和平台 12 2.2 基本安全结构 13 2.3 字节代码验证和类型安全 14 2.4 签名应用小程序 15 2.5 关于安全错误及其修复的简要历史 16 第3章 JDK1.2安全结构 19 3.1 起源 19 ...

    java8看不到源码-tensorflow-mnist-test:我在java中测试我们的tensorflow和mnist

    中读取它,验证您可以在两种语言中使用它并获得相同的结果。 先决条件 要运行此示例,您需要以下内容。 Tensorflow >=1.0.1 张量流_jni >=1.0.1 libtensorflow.jar >=1.0.1 您还需要下载并解压 mnist 训练数据。 ...

    GetMACAddress:得到本机的MAC地址

    GetMACAddress 得到本机的MAC地址 ...查阅有关LAN的文档资料,特别是以太网(IEEE802.3 CSMA/CD MAC)标准,采用所掌握的程序设计语言,编写代码,输出本机以太网适配器(网络接口卡)的MAC地址,以16进制形式表示。

    Understand-2.6.563-Linux

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    代码阅读工具Toolworks.Understand.v2.6.604

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    Scientific.Toolworks.Understand.v4.0.811破解版

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    Understand 5.0.969.iso

    1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2.多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3.代码语法高亮、代码折迭、交叉跳转、书签等...

    代码阅读工具(understand )下载

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    Understand 4.0.811 破解版

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...

    Understand for c++ 2.6

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    代码分析 Scientific Toolworks Understand 4.0.908 - x64 目前最新crack资源1

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...

    代码分析 Scientific Toolworks Understand 4.0.908 - x64 目前最新crack资源2

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...

    Scientific Toolworks Understand.4.0.880-x64

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持  2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X  3、代码 代码语法高亮、代码 代码折叠、交叉...

    Scientific Toolworks Understand.4.0.860-x86

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持  2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X  3、代码 代码语法高亮、代码 代码折叠、交叉...

    看代码的工具软件比sourceinsight好用的多(带注册机)

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持  2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X  3、代码语法高亮、代码折叠、交叉...

    新版Android开发教程.rar

    程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...

    Understand-2.6.556_2

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

    umd-file-renamer:一个基于PSP游戏属性生成UMD文件标准文件名的应用程序

    该代码使用最新的Swing Layout库用Java编写,因此此桌面应用程序可以使用OS本机界面(在Mac OS X,Windows和Linux / Ubuntu上经过测试)并在所有这些平台上运行。 它以两种语言提供:英语和西班牙语,您可以在应用...

    (Scientific Toolworks Understand)v2.6.556 x86_1

    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...

Global site tag (gtag.js) - Google Analytics