- 浏览: 115045 次
- 性别:
- 来自: 上海
文章分类
最新评论
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());
}
}
用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); : |
5 结束语
作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。
Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。
以上讨论的程序适合于Windows XP/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。
发表评论
-
正则基础
2009-11-03 10:15 593public class ReEX { /** * ... -
cookie
2009-11-03 10:25 624//servlet//生成cookie对名象java.uti ... -
junit
2009-11-03 17:44 673junit简介: * 创建test目录与src同级,同时建立 ... -
网站首页静态化方案
2009-11-06 17:52 6751 Freemarker网站静态化的实现(转) 首页: ... -
Apache BeanUtils
2009-11-29 21:17 567BeanUtils.copyProperties 与 Pr ... -
IO流
2009-11-29 21:18 5901 输入/输出流 字节流 字符 ... -
Map-iterator
2009-11-29 21:20 718Set temp=new HashSet();Set e ... -
日期Format
2009-11-29 21:26 708日期格式化 Date currentTime = new Da ... -
判断是否属于此类型
2009-11-29 21:27 495event.getValue() instanceof Act ... -
日期处理
2009-11-29 21:28 557Calendar g=Calendar.getInsta ... -
生成jar包
2009-11-29 21:29 474生成jar包 jar -cvf test.jar *.* *. ... -
同步锁
2009-11-29 21:30 522public void synchronized getall ... -
序列化与反序列化
2009-11-29 21:31 607序列化是把一个对象的状态写入一个字节流的过程,它执行RMI,R ... -
java mail
2009-11-29 21:33 613JavaMail下载与安装 http://java.sun.c ... -
文件上传组件
2009-11-29 21:34 494文件上传组件 1 Apache的Commons FileUpl ... -
pager-taglib的安装和使用
2009-11-29 21:34 4721、拷贝pager-taglib.jar包 2、在JSP页面中 ... -
文件下载
2009-11-29 21:35 454文件下载代码(2008-02-26 2 ... -
字符串日期转换
2009-12-03 17:09 694java开发时往往需要做字符串和日期的转换 主要用到:java ... -
java反编译工具jad
2009-12-13 22:40 607http://www.kpdus.com/jad.html ... -
java优化编程-字符串驻留
2010-01-20 15:26 721字符串比较时,采用.intern()方法将字符串添加到驻留池中 ...
相关推荐
本文主要介绍了一种利用Java语言实现跨平台MAC地址读取的新方法。通过利用Java的`NetworkInterface`类,可以实现无需依赖底层操作系统的纯Java MAC地址读取功能,进而支持更广泛的网络应用需求,如远程唤醒和版权...
本文将介绍一种使用Java编程语言来实现获取本地或远程计算机MAC地址的方法。 #### 核心代码分析 下面展示的是一个名为`GetMACAddress`的类,它包含了一个方法`getMACAddress`用于获取指定IP地址所对应的MAC地址。...
在Java编程中,读取包含中文字符的文件时可能会遇到乱码问题,这通常是由于编码格式不匹配导致的。要解决这个问题,我们需要理解文件的原始编码格式,并在Java代码中正确地设置字符集。以下是一些相关的知识点: 1....
在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...
javaIO简单的写入读取文件是Java编程语言中最基本的文件操作。下面我们将详细介绍javaIO简单的写入读取文件的知识点。 一、 文件写入 文件写入是指将数据从程序中写入到文件中。Java中提供了多种文件写入方式,...
本文将深入探讨如何使用Java语言调用底层库来实现串口数据的采集与返回,主要关注`RxtxComm`库的使用。 ### 一、串口通信基础 串口通信,也称为串行通信,是计算机间或计算机与其他设备之间进行数据传输的一种方式...
Java调用OCR进行图片识别是指使用Java语言通过Tesseract-OCR对图片进行识别的技术。下面是相关知识点的详细解释: 一、Tesseract-OCR简介 Tesseract-OCR是一个开源的OCR(Optical Character Recognition,光学字符...
本篇文章将深入探讨如何利用Java编程语言通过SNMP协议来获取交换机设备上的详细信息,包括PC机的MAC地址、IP地址以及连接的端口号。 首先,SNMP是一种应用层协议,它允许网络管理员远程收集和配置网络设备的数据。...
首先,Java语言本身是跨平台的,但它并不直接提供获取MAC地址的API。然而,我们可以利用Java的Runtime类来执行操作系统级别的命令,例如Windows中的`ipconfig`,从而获取网络接口的MAC地址信息。 Runtime类是Java中...
Java语言具有多项显著特性,包括平台独立性、可移植性、面向对象设计以及多线程处理能力。平台独立性意味着Java编写的程序可以在支持Java虚拟机(JVM)的任何设备上运行,不受特定操作系统的限制。可移植性允许Java...
在Java编程语言中,获取计算机硬件的物理地址,即网卡MAC地址,是常见的系统信息获取需求。MAC地址是一个用于标识网络设备的唯一物理地址,通常由六组两字符的十六进制数字组成,例如“00:14:22:01:23:45”。本篇...
在给定的标题“C#程序Mac地址AES加密及解密”中,我们关注的核心知识点是利用C#编程语言处理硬件标识,特别是Mac地址,并且结合了高级加密标准(AES)进行数据的安全传输与存储。 Mac地址,全称为Media Access ...
在Java编程中,读取中文文件时可能会遇到乱码问题,这是由于字符编码不匹配导致的。本篇文章将深入探讨这个问题,并提供解决方案。 首先,我们要理解什么是字符编码。字符编码是用来表示文本中字符的一种方式,常见...
Java语言的特点主要包括: 1. 面向对象:Java是一种面向对象的语言,它允许程序员使用类、对象、封装、继承和多态等概念来组织代码。类是对象的蓝图,对象则是类的实例。封装是将数据和操作数据的方法捆绑在一起,...
5. **编程实现**:在Python、Java、C#等编程语言中,可以编写函数或者模块来读取OUI数据库,通过匹配MAC地址的前六位来查找设备厂商。例如,Python中可以使用`scapy`库,Java中可以使用`java.net.NetworkInterface`...
在Java编程中,读取和写入中文字符时经常遇到乱码问题,这主要是由于编码格式不匹配导致的。本文将深入探讨这个问题,并提供一种彻底解决JAVA读取写入TXT中文乱码问题的方法。 首先,我们需要理解编码的本质。在...
获取MAC地址的代码可以使用多种编程语言实现,如C++、C#、Java、Python等。例如,在Python中,可以使用`uuid`库的`getnode()`方法,或者直接操作`/sys/class/net`目录。 5. **注意事项**: - 获取MAC地址可能需要...
- **Java**:使用`java.net.NetworkInterface`类,遍历所有网络接口并获取MAC地址。 - **C#**:通过`ManagementClass`和`ManagementObjectCollection`操作WMI。 3. **第三方软件**:有些系统工具或网络诊断软件也...
在Windows平台上,开发者可以利用JavaCV提供的API,结合OpenCV库来实现图像的读取、处理和分析。例如,使用`HighGui.imread()`函数加载图片,然后通过`Imgproc.cvtColor()`进行颜色空间转换,进一步使用`Threshold`...