千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          在我們在寫程序的過程中,有些時候需要知道一些電腦的硬件信息,比如我們寫一些需要注冊的程序的時候,就需要得到某個電腦特定的信息,一般來說,網(wǎng)卡的物理地址是不會重復(fù)的,我們正好可以用它來做為我們識別一臺電腦的標(biāo)志.那如何得到網(wǎng)卡的物理地址呢?我們可以借助于ProcessBuilder這個類,這個類是JDK1.5新加的,以前也可以用Runtime.exce這個類.在此我們將演示一下如何在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這個類,這個類比起以前用Runtime.exec來說,要強大一些,它可以指定一個環(huán)境 變量,并指定程序運行時的目錄空間,并且也可以得到程序運行時的環(huán)境變量.因為ipconfig這個命令已經(jīng)是system32里面的,所以不需要我們另外再設(shè)環(huán)境變量或者指定程序的運行時目錄空間.我們直接用就可以了,然后得到進程的輸出流,就可以分析出我們所需要的東西了.是不是挺簡單的呢:)

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



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

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

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

          LZ 的程序就出錯了  回復(fù)  更多評論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 13:12 | 千里冰封
          說得很好,我在程序里面也說了,我那個是中文LINUX的輸出,如果是英文,把"硬件地址"改為"Ethernet HWaddr"就可以了,如果不這樣的話,就只能調(diào)用本地方法直接獲得了
            回復(fù)  更多評論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-27 13:22 | 死循環(huán)
          受教  回復(fù)  更多評論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2007-09-30 16:22 | 1shou
          我做的時候 是用 jni 寫了一個 c++ 類,,讀 取 網(wǎng)卡 MAC CPU ID 硬 盤編號,, 呵呵,,只是發(fā)現(xiàn)很不穩(wěn)定。  回復(fù)  更多評論
            
          # re: JAVA得到網(wǎng)卡物理地址(windows和Linux)
          2013-04-27 14:53 | zdc
          屁蛋,不用root權(quán)限無法得到正確的結(jié)果,你這程序和腳本編程有多大不同,還是用c/c++吧  回復(fù)  更多評論
            
          主站蜘蛛池模板: 祥云县| 柯坪县| 遂川县| 墨脱县| 雷州市| 库伦旗| 奉化市| 崇州市| 哈巴河县| 桂东县| 甘洛县| 横山县| 库尔勒市| 邮箱| 克什克腾旗| 沾益县| 正安县| 礼泉县| 马山县| 湖北省| 东台市| 甘德县| 武威市| 茶陵县| 额济纳旗| 双桥区| 苍南县| 仁布县| 沈阳市| 凭祥市| 成安县| 建瓯市| 辰溪县| 安多县| 吉木乃县| 扬州市| 泰兴市| 灵璧县| 亳州市| 长泰县| 洞头县|