- 浏览: 155521 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
jiangyeqt:
好好的温习了一遍,讲的非常的到位
Session的原理 -
JAVA静静:
这是什么啊?有没有源码?看不懂诶!
开源框架Pushlet入门 -
colinzhy:
讲的很深刻,学习了
Session的原理 -
昔雪似花:
...
Map-iterator -
不相信眼泪:
恩,很好,多谢
.scc文件是做什么用的?
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地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。
发表评论
-
Java通用数据访问层Fastser-DAL推荐
2014-12-29 10:20 5568本着不重复造轮子的原则,基于mybatis、spring ... -
正则基础
2009-11-03 10:15 1019public class ReEX { /** * ... -
cookie
2009-11-03 10:25 652//servlet//生成cookie对名象java.uti ... -
网站首页静态化方案
2009-11-06 17:52 9441 Freemarker网站静态化的实现(转) 首页: ... -
Apache BeanUtils
2009-11-29 21:17 590BeanUtils.copyProperties 与 Pr ... -
IO流
2009-11-29 21:18 6051 输入/输出流 字节流 字符 ... -
Map-iterator
2009-11-29 21:20 885Set temp=new HashSet();Set e ... -
日期Format
2009-11-29 21:26 731日期格式化 Date currentTime = new Da ... -
判断是否属于此类型
2009-11-29 21:27 675event.getValue() instanceof Act ... -
日期处理
2009-11-29 21:28 594Calendar g=Calendar.getInsta ... -
生成jar包
2009-11-29 21:29 644生成jar包 jar -cvf test.jar *.* *. ... -
同步锁
2009-11-29 21:30 646public void synchronized getall ... -
序列化与反序列化
2009-11-29 21:31 448序列化是把一个对象的状态写入一个字节流的过程,它执行RMI,R ... -
java mail
2009-11-29 21:33 743JavaMail下载与安装 http://java.sun.c ... -
文件上传组件
2009-11-29 21:34 579文件上传组件 1 Apache的Commons FileUpl ... -
pager-taglib的安装和使用
2009-11-29 21:34 6451、拷贝pager-taglib.jar包 2、在JSP页面中 ... -
文件下载
2009-11-29 21:35 762文件下载代码(2008-02-26 2 ... -
字符串日期转换
2009-12-03 17:09 1053java开发时往往需要做字符串和日期的转换 主要用到:java ... -
java反编译工具jad
2009-12-13 22:40 699http://www.kpdus.com/jad.html ... -
java优化编程-字符串驻留
2010-01-20 15:26 806字符串比较时,采用.intern()方法将字符串添加到驻留池中 ...
相关推荐
第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 ...
第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 ...
中读取它,验证您可以在两种语言中使用它并获得相同的结果。 先决条件 要运行此示例,您需要以下内容。 Tensorflow >=1.0.1 张量流_jni >=1.0.1 libtensorflow.jar >=1.0.1 您还需要下载并解压 mnist 训练数据。 ...
GetMACAddress 得到本机的MAC地址 ...查阅有关LAN的文档资料,特别是以太网(IEEE802.3 CSMA/CD MAC)标准,采用所掌握的程序设计语言,编写代码,输出本机以太网适配器(网络接口卡)的MAC地址,以16进制形式表示。
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2.多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3.代码语法高亮、代码折迭、交叉跳转、书签等...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉跳转、书签等...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码 代码语法高亮、代码 代码折叠、交叉...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的 project 也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码 代码语法高亮、代码 代码折叠、交叉...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折叠、交叉...
程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
该代码使用最新的Swing Layout库用Java编写,因此此桌面应用程序可以使用OS本机界面(在Mac OS X,Windows和Linux / Ubuntu上经过测试)并在所有这些平台上运行。 它以两种语言提供:英语和西班牙语,您可以在应用...
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...