不多說,直接上代碼。
package com.ckw.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.Map.Entry;
public class TestOfSubNetMask {
Map<String, String> map = new HashMap<String, String>();
String ipAddress;
String subNetMask;
boolean flag = false; //用來標記一對IP地址跟子網掩碼 (位置相鄰的即爲一對)
//獲取相對應IP地址的子網掩碼
public void getIPAddressAndMask() {
String os = System.getProperty("os.name");
if (os != null && os.startsWith("Windows")) {
try {
String command = "cmd.exe /c ipconfig /all";
Process p = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "gb2312"));
String line;
System.out.println("---------------------------------------------------------------");
while ((line = br.readLine()) != null) {
System.out.println(line); //這句可以省略,主要是爲了把所有的信息打印出來方便對比
/*
* 獲得機器IP地址
* 在以“IPv4”開頭的那一行獲取ip地址,英文版是以“IP Address”開頭
* 格式爲:
* IPv4 地址 . . . . . . . . . . . . : 10.10.116.132(首選) //見doc下的命令輸出
*/
if (line.indexOf("IPv4 地址") > 0 || line.indexOf("IP Address") > 0) {
int index = line.indexOf(":");
index += 2;
ipAddress = line.substring(index);
//去掉漢字 “10.10.116.132(首選)”
int i;
char [] array = ipAddress.toCharArray();
for(i=0; i<array.length; i++){
if(array[i]!='.' && (array[i]<'0'||array[i]>'9'))
break;
}
ipAddress = ipAddress.substring(0, i);
flag = true; //存在IP地址,必存在其相應的子網掩碼
}
/*
* 獲得機器子網掩碼
* 在以“子網掩碼”開頭的那一行獲取子網掩碼,英文版是以“Subnet Mask”開頭
* 格式爲:
* 子網掩碼 . . . . . . . . . . . . : 255.255.255.192
*/
if (flag==true && (line.indexOf("子網掩碼 ") > 0 || line.indexOf("Subnet Mask") > 0)) {
int index = line.indexOf(":");
index += 2;
subNetMask = line.substring(index);
flag = false; //消耗掉
map.put(ipAddress, subNetMask);
}
}
br.close();
System.out.println("---------------------------------------------------------------");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//主函數測試
public static void main(String args[]){
TestOfSubNetMask test = new TestOfSubNetMask();
test.getIPAddressAndMask();
Map<String, String> map = test.map;
Iterator<Entry<String, String>> i = map.entrySet().iterator();
while(i.hasNext()){
Entry<String, String> e = i.next();
String ipAddress = e.getKey();
String subNetMask = e.getValue();
System.out.println("IP 地 址:" + ipAddress);
System.out.println("子網掩碼:" + subNetMask);
}
}
}
結果爲:
---------------------------------------------------------------
Windows IP 配置
主機名 . . . . . . . . . . . . . : DADI
主 DNS 後綴 . . . . . . . . . . . :
節點類型 . . . . . . . . . . . . : 混合
IP 路由已啓用 . . . . . . . . . . : 否
WINS 代理已啓用 . . . . . . . . . : 否
無線局域網適配器 無線網絡連接 29:
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft Virtual WiFi Miniport Adapter #26
物理地址. . . . . . . . . . . . . : 22-16-D8-C9-A3-B2
DHCP 已啓用 . . . . . . . . . . . : 否
自動配置已啓用. . . . . . . . . . : 是
本地鏈接 IPv6 地址. . . . . . . . : fe80::89eb:f7f1:e6b7:6133%74(首選)
IPv4 地址 . . . . . . . . . . . . : 172.17.31.1(首選)
子網掩碼 . . . . . . . . . . . . : 255.255.0.0
默認網關. . . . . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 1512183512
DHCPv6 客戶端 DUID . . . . . . . : 00-01-00-01-19-03-EF-D5-08-60-6E-DC-A7-B7
DNS 服務器 . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
TCPIP 上的 NetBIOS . . . . . . . : 已啓用
無線局域網適配器 無線網絡連接:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Qualcomm Atheros AR9485 Wireless Network Adapter
物理地址. . . . . . . . . . . . . : 20-16-D8-C9-A3-B2
DHCP 已啓用 . . . . . . . . . . . : 是
自動配置已啓用. . . . . . . . . . : 是
以太網適配器 本地連接:
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
物理地址. . . . . . . . . . . . . : 08-60-6E-DC-A7-B7
DHCP 已啓用 . . . . . . . . . . . : 是
自動配置已啓用. . . . . . . . . . : 是
本地鏈接 IPv6 地址. . . . . . . . : fe80::c0c9:c8b6:4003:7976%12(首選)
IPv4 地址 . . . . . . . . . . . . : 10.10.116.132(首選)
子網掩碼 . . . . . . . . . . . . : 255.255.255.192
獲得租約的時間 . . . . . . . . . : 2015年7月18日 23:01:04
租約過期的時間 . . . . . . . . . : 2015年7月25日 23:01:02
默認網關. . . . . . . . . . . . . : 10.10.116.129
DHCP 服務器 . . . . . . . . . . . : 222.200.98.70
DHCPv6 IAID . . . . . . . . . . . : 252207214
DHCPv6 客戶端 DUID . . . . . . . : 00-01-00-01-19-03-EF-D5-08-60-6E-DC-A7-B7
DNS 服務器 . . . . . . . . . . . : 202.96.128.86
202.116.128.1
TCPIP 上的 NetBIOS . . . . . . . : 已啓用
隧道適配器 本地連接* 37:
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Teredo Tunneling Pseudo-Interface
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已啓用 . . . . . . . . . . . : 否
自動配置已啓用. . . . . . . . . . : 是
IPv6 地址 . . . . . . . . . . . . : 2001:0:9d38:6ab8:aa:e4df:48c0:88c7(首選)
本地鏈接 IPv6 地址. . . . . . . . : fe80::aa:e4df:48c0:88c7%66(首選)
默認網關. . . . . . . . . . . . . : ::
TCPIP 上的 NetBIOS . . . . . . . : 已禁用
隧道適配器 6TO4 Adapter:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft 6to4 Adapter
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已啓用 . . . . . . . . . . . : 否
自動配置已啓用. . . . . . . . . . : 是
隧道適配器 Reusable Microsoft 6To4 Adapter:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft 6to4 Adapter #2
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已啓用 . . . . . . . . . . . : 否
自動配置已啓用. . . . . . . . . . : 是
隧道適配器 本地連接* 17:
媒體狀態 . . . . . . . . . . . . : 媒體已斷開
連接特定的 DNS 後綴 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft 6to4 Adapter #3
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已啓用 . . . . . . . . . . . : 否
自動配置已啓用. . . . . . . . . . : 是
//部分已省略。。。。。。
---------------------------------------------------------------
//這纔是主要的輸出結果
IP 地 址:10.10.116.132
子網掩碼:255.255.255.192
IP 地 址:172.17.31.1
子網掩碼:255.255.0.0