Java根据输入的ip得到对应的地址及运营商等信息

  1. 封装一个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; } }
  2. 读取文件,获取所有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);
		
	}
经验分享 程序员 微信小程序 职场和发展