Java根据输入的ip得到对应的地址及运营商等信息
- 封装一个ip信息的poji package nuc.edu.lisheng; public class IpAddress { private long min; private long max; private String address; private String carrier; public long getMin() { return min; } public void setMin(long min) { this.min = min; } public long getMax() { return max; } public void setMax(long max) { this.max = max; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCarrier() { return carrier; } public void setCarrier(String carrier) { this.carrier = carrier; } public IpAddress(long min, long max, String address, String carrier) { super(); this.min = min; this.max = max; this.address = address; this.carrier = carrier; } public IpAddress() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "该ip的地址为:"+address+" 运营商为:"+carrier; } }
- 读取文件,获取所有IP对应的信息,存储到集合中
public List<IpAddress> ReadData() {
List<IpAddress> list = new LinkedList<>();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("data/ip.txt"), "utf-8"));
String line = "";
while ((line = br.readLine()) != null) {
String[] split = line.split("\|");
list.add(new IpAddress(Long.parseLong(split[2]), Long.parseLong(split[3]),
split[4] + split[5] + split[6] + split[7]+split[8], split[9]));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return list;
}
3.将输入的IP地址转换成长整形,用于ip地址范围比较
public Long StringIptoLong(String ip) {
String[] ips = ip.split("\.");
Long ipLong = 256 * 256 * 256 * Long.parseLong(ips[0]) + 256 * 256 * Long.parseLong(ips[1])
+ 256 * Long.parseLong(ips[2]) + Long.parseLong(ips[3]);
return ipLong;
}
4.用折半查找在集合中找到对应的信息
public void getIpInfo(String ip) {
Long longIp=StringIptoLong(ip);
List<IpAddress> list=ReadData();
int max=list.size()-1;
int min=0;
int result=(max+min)/2;
IpAddress address=null;
while(true) {
if(list.get(result).getMin()<=longIp&&list.get(result).getMax()>=longIp) {
address=list.get(result);
break;
}else if(list.get(result).getMax()<longIp) {
int a=result;
result=(a+max)/2;
min=a;
}else if(list.get(result).getMin()>longIp) {
int a=result;
result=result/2;
max=a;
}
}
System.out.println(address);
}
