千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          在我們?cè)趯?xiě)程序的過(guò)程中,有些時(shí)候需要知道一些電腦的硬件信息,比如我們寫(xiě)一些需要注冊(cè)的程序的時(shí)候,就需要得到某個(gè)電腦特定的信息,一般來(lái)說(shuō),網(wǎng)卡的物理地址是不會(huì)重復(fù)的,我們正好可以用它來(lái)做為我們識(shí)別一臺(tái)電腦的標(biāo)志.那如何得到網(wǎng)卡的物理地址呢?我們可以借助于ProcessBuilder這個(gè)類(lèi),這個(gè)類(lèi)是JDK1.5新加的,以前也可以用Runtime.exce這個(gè)類(lèi).在此我們將演示一下如何在Windows和Linux環(huán)境下得到網(wǎng)卡的物理地址.

          代碼如下:
          /*
           * 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這個(gè)類(lèi),這個(gè)類(lèi)比起以前用Runtime.exec來(lái)說(shuō),要強(qiáng)大一些,它可以指定一個(gè)環(huán)境 變量,并指定程序運(yùn)行時(shí)的目錄空間,并且也可以得到程序運(yùn)行時(shí)的環(huán)境變量.因?yàn)閕pconfig這個(gè)命令已經(jīng)是system32里面的,所以不需要我們另外再設(shè)環(huán)境變量或者指定程序的運(yùn)行時(shí)目錄空間.我們直接用就可以了,然后得到進(jìn)程的輸出流,就可以分析出我們所需要的東西了.是不是挺簡(jiǎn)單的呢:)

          此程序可以得到windows下和Linux下的網(wǎng)卡地址,不過(guò)LINUX要是中文版的,英文版的也一樣,只不過(guò)把字替換一下就可以了。這樣我們的程序就有了兩個(gè)平臺(tái)的實(shí)現(xiàn)。



          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-09-27 09:22 千里冰封 閱讀(4319) 評(píng)論(16)  編輯  收藏 所屬分類(lèi): JAVASE

          FeedBack:
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 10:31 | BeanSoft
          支持一下的.  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 10:41 | zht
          不錯(cuò)  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 11:11 | 冷面閻羅
          對(duì)多個(gè)網(wǎng)卡只能讀取一個(gè)來(lái)  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 11:28 | 千里冰封
          呵呵,那是,對(duì)于多個(gè)的話,也可以使用命令一個(gè)一個(gè)得到  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 11:31 | t
          貌似以前在哪見(jiàn)到過(guò)  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 11:33 | 千里冰封
          是嗎?
          當(dāng)然不可能就我一個(gè)人寫(xiě)得到網(wǎng)卡的地址了,別人也會(huì)寫(xiě),但是實(shí)現(xiàn)的細(xì)節(jié)不一定一樣  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址
          2007-09-27 11:43 | t
          實(shí)現(xiàn)的細(xì)節(jié)確實(shí)不一樣,呵呵。  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(window和Linux)[未登錄](méi)
          2007-09-27 12:22 | 阿蜜果
          恩,不錯(cuò),不過(guò)個(gè)人覺(jué)得最好采用bat方式,通過(guò)java來(lái)調(diào)用bat,以后有改動(dòng)容易點(diǎn)
          我也使用過(guò)它來(lái)調(diào)用Windows和Linux的本地接口,可惜的是不跨平臺(tái)。
          有點(diǎn)麻煩  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 12:31 | 千里冰封
          @阿蜜果
          呵呵, bat只有WINDOWS下才有用,所以只能起動(dòng)系統(tǒng)相關(guān)的進(jìn)程了,呵呵,如果調(diào)用本地方法的話,還需要加一個(gè)dll或者so文件才能使用.:)歡迎經(jīng)常來(lái)小屋坐坐  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)[未登錄](méi)
          2007-09-27 12:50 | 阿蜜果
          @ 千里冰封
          這個(gè)我知道,呵呵,在Windows下用bat,Linux下用shell腳本,以后如果有什么改動(dòng)應(yīng)該容易點(diǎn)。一點(diǎn)建議:)
          最近更新blog好勤快阿
          嘻嘻  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 12:51 | 千里冰封
          @阿蜜果
          呵呵,那是,方便了一些,女生搞JAVA的不容易啊,以后還要多向你學(xué)習(xí)哦  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 13:10 | inx
          這個(gè)程序靠字符串搜索獲得MAC ADDRESS 太不可靠了;
          要多考慮不同操作系統(tǒng)平臺(tái)的, 還有中文/英文環(huán)境;
          比如有的返回是
          eth1 Link encap:Ethernet HWaddr 00:14:5E:e3:BE:2E

          LZ 的程序就出錯(cuò)了  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 13:12 | 千里冰封
          說(shuō)得很好,我在程序里面也說(shuō)了,我那個(gè)是中文LINUX的輸出,如果是英文,把"硬件地址"改為"Ethernet HWaddr"就可以了,如果不這樣的話,就只能調(diào)用本地方法直接獲得了
            回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 13:22 | 死循環(huán)
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-30 16:22 | 1shou
          我做的時(shí)候 是用 jni 寫(xiě)了一個(gè) c++ 類(lèi),,讀 取 網(wǎng)卡 MAC CPU ID 硬 盤(pán)編號(hào),, 呵呵,,只是發(fā)現(xiàn)很不穩(wěn)定。  回復(fù)  更多評(píng)論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2013-04-27 14:53 | zdc
          屁蛋,不用root權(quán)限無(wú)法得到正確的結(jié)果,你這程序和腳本編程有多大不同,還是用c/c++吧  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 剑川县| 昌图县| 茶陵县| 重庆市| 青海省| 黎川县| 新兴县| 南木林县| 翁牛特旗| 全椒县| 鄂伦春自治旗| 哈巴河县| 班戈县| 正安县| 台前县| 五河县| 锡林郭勒盟| 大同县| 从江县| 洛宁县| 奈曼旗| 永德县| 烟台市| 噶尔县| 义乌市| 德保县| 崇信县| 建阳市| 海口市| 乌苏市| 高淳县| 枝江市| 甘泉县| 黑山县| 莒南县| 南澳县| 城口县| 色达县| 西峡县| 当涂县| 宁晋县|