自己维护一个简单的ip库


阅读前提: 

            在阅读之前,请参考知乎上对ip库的一个简要讨论:

             http://www.zhihu.com/question/19584593


阅读目的:一步一步建立ip库,目前采用的是纯真IP库,纯真ip库是一个民间收集的ip库:

           QQ IP数据库收集了包括中国电信、中国网通、长城宽带、网通宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据


1 : 下载地址:

        我的下载地址为:http://www.pc6.com/softview/SoftView_41490.html

         一旦失效,请自行baidu.

2 :   下载以后是是一个纯真的Exe文件,点击安装,没关系。纯真已经封装为Exe APP 方便使用了。

3 : 安装后,启动界面如下,请点击导出按钮:

    095123_JdbE_1791874.png


 3:导出的文件,在本博文之中,将命名为IpBase


 4 : 原始的数据格式如下:

 起始                 结束                   位置

1.57.23.0       1.57.31.255     黑龙江省绥化市 联通

1.57.32.0       1.57.32.255     黑龙江省绥化市望奎县 联通

1.57.33.0       1.57.33.255     黑龙江省绥化市 联通

1.57.34.0       1.57.34.255     黑龙江省绥化市肇东市 联通


通常在应用程序之中,需要将ip转换为一个long 类型的值,并且将地理位置分为多级:

 实例如下:

    465645664,44655468,黑龙江省,绥化市

 由于具体的区县,目前数据采集还不够完善。所以我们只是简单的区两级地理位置:

  

   以下是一个我写的转换代码:比较繁琐。将 省份,区域,

package com.mixbox.parser.IPBaseTransfer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import com.coreJava.ipAndLong.IpAndLongTransfer;

public class cz_fileTofile {

	public static final String _filePath = "E:\\ipBase.txt";
	public static final String _outPath = "E:\\ipBase_new2.txt";
	public static final String _blank = " ";
	public static BufferedReader _bufferedReader;
	public static BufferedWriter _bufferedWriter;
	public static String _comma = ",";

	public static void main(String[] args) throws IOException {
		_bufferedReader = new BufferedReader(new InputStreamReader(
				new FileInputStream(_filePath), "GBK"));
		_bufferedWriter = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream(_outPath), "GBK"));

		String str = null;

		while ((str = _bufferedReader.readLine()) != null) {

			try {

				pn("--------------------------- start");
				String onebank = str.replaceAll("\\s{1,}", " ");
				pn(onebank);

				String[] records = onebank.split(_blank);

				if (records.length < 3) {
					System.err.println(onebank);
					System.exit(1);
				}

				String location = records[2];
				pn(location);

				// 我们把location直接解析成 省份,城市,和地区
				String province = null;
				String city = null;
				String area = null;

				// 针对有省份的进行修改
				province = getProvince(location);
				city = getCity(location);

				pn("修改后的省:" + province);
				pn("修改后的城市:" + city);

				long begin_ip = IpAndLongTransfer.ipToLong(records[0]);
				long end_ip = IpAndLongTransfer.ipToLong(records[1]);

				pn("开始ip" + begin_ip);
				pn("结束ip" + end_ip);

				StringBuffer sb = new StringBuffer();
				sb.append(begin_ip).append(_comma).append(end_ip)
						.append(_comma).append(province).append(_comma)
						.append(city);

				String writerString = sb.toString();
				_bufferedWriter.write(writerString);
				_bufferedWriter.newLine();

				pn("--------------------------- end \n");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	// 从location之中得到我们的城市
	private static String getCity(String location) {
		String returnCity = "无法确定";

		// 当前的字符串是某省某市的格式,省下面可能是市,也可能是区,比如说:黑龙江省大兴安岭地区
		if (location.contains("省")) {

			// 如果有区,那么先截取到区
			// 3683905536,3683905631,黑龙江,大兴安岭地区
			// 3683902117,3683902141,黑龙江,伊春市伊春区
			//
			if (location.contains("区")) {
				int num_province = location.indexOf("省");
				int num_city = location.indexOf("区");
				returnCity = location.substring(num_province + 1, num_city + 1);

			}

			// 比如 大兴安领区是不包括市,所有returncity不变
			// 如果是 伊春市伊春区,那么截取的就是 伊春市
			if (location.contains("市")) {

				int num_province = location.indexOf("省");
				int num_city = location.indexOf("市");
				returnCity = location.substring(num_province + 1, num_city + 1);

			}
		}

		if (location.contains("北京") || location.contains("上海")
				|| location.contains("重庆") || location.contains("天津")) {

			int length = location.length();

			// 其中的信息只包含了 北京市,上海市,重庆市,天津市等
			if (location.length() == 3) {

				// 其中的信息包含了北京市以外的其他区县
			} else if (length > 3) {
				int num_split = location.indexOf("市") + 1;
				returnCity = location.substring(num_split);
			}
		}

		if (location.contains("西藏") || location.contains("新疆")
				|| location.contains("广西") || location.contains("宁夏")
				|| location.contains("内蒙")) {

			int firstSplitPoint = 0;
			int endSplitPoint = location.length();

			// 内蒙占位为3,在原始数据之中是内蒙古,而不是内蒙古自治区
			if (location.contains("内蒙")) {
				firstSplitPoint = 3;

				// 如果整个的位置为“内蒙古",那么就无法确定内蒙古下面到底是哪一个城市
				if (location.equals("内蒙古")) {
					returnCity = "无法确定";
				}

				int num_city = location.indexOf("市");
				returnCity = location.substring(firstSplitPoint, num_city + 1);

				// 其他的几个自制区为2
			} else {
				firstSplitPoint = 2;

				if (location.equals("西藏") || location.equals("新疆")
						|| location.equals("广西") || location.equals("宁夏")) {

					returnCity = "无法确定";
				}

				int num_city = location.indexOf("市");
				returnCity = location.substring(firstSplitPoint, num_city + 1);
			}
		}

		// 特别行政区
		if (location.contains("香港")) {
			returnCity = "香港";
		}
		if (location.contains("澳门")) {
			returnCity = "澳门";
		}

		return returnCity;
	}

	private static String getProvince(String location) {
		String returnProvince = "无法确定";

		// 省
		if (location.contains("省")) {
			if (location.equals("黑龙江省")) {
				returnProvince = "黑龙江省";
			} else {
				returnProvince = location.substring(0, 3);
			}
		}

		// 自治区
		if (location.contains("西藏")) {
			returnProvince = "西藏自治区  ";
		}

		if (location.contains("新疆")) {
			returnProvince = "新疆维吾尔自治区 ";
		}

		if (location.contains("广西")) {
			returnProvince = " 广西壮族自治区 ";
		}

		if (location.contains("宁夏")) {
			returnProvince = "宁夏回族自治区 ";
		}

		if (location.contains("内蒙古")) {
			returnProvince = "内蒙古自治区";
		}

		// 直辖市
		if (location.contains("北京")) {
			returnProvince = "北京市";
		}

		if (location.contains("上海")) {
			returnProvince = "上海市";
		}

		if (location.contains("天津")) {
			returnProvince = "天津市";
		}
		if (location.contains("重庆")) {
			returnProvince = "重庆市";
		}

		// 特别行政区
		if (location.contains("香港")) {
			returnProvince = "香港特别行政区";
		}

		if (location.contains("澳门")) {
			returnProvince = "澳门特别行政区";
		}

		return returnProvince;
	}

	private static void isBkank(String[] records, int i) {
		if (records[i] != _blank) {
			p(records[i]);
		}
	}

	public static void pn(Object o) {
		System.out.println(o.toString());
	}

	public static void p(Object o) {
		System.out.print(o.toString());
	}

}


  作为一个参考:请自行再做修改~  

            Simple Tips。


    转换后的结果如下所示:

    long               long          省份    城市

3658172295,3658172295,河北省,保定市

3658172296,3658172333,河北省,保定市

3658172334,3658172334,河北省,保定市

3658172335,3658172402,河北省,保定市

3658172403,3658172403,河北省,保定市

3658172404,3658172415,河北省,保定市

3658172416,3658172671,河北省,秦皇岛市

3658172672,3658172927,河北省,秦皇岛市

3658172928,3658175487,河北省,秦皇岛市

3658175488,3658176879,河北省,廊坊市

3658176880,3658176880,河北省,廊坊市

3658176881,3658176904,河北省,廊坊市

3658176905,3658176905,河北省,廊坊市

3658176906,3658176998,河北省,廊坊市

3658176999,3658176999,河北省,廊坊市

3658177000,3658177020,河北省,廊坊市

3658177021,3658177021,河北省,廊坊市

3658177022,3658177642,河北省,廊坊市

3658177643,3658177643,河北省,廊坊市

3658177644,3658177681,河北省,廊坊市

3658177682,3658177682,河北省,廊坊市


转载于:https://my.oschina.net/infiniteSpace/blog/313981

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值