使用两种方式实现:
- 使用内存映射文件方式读取(位于com.difeng.qqwry1包下)
- 使用byte数组读取(位于com.difeng.qqwry2包下)
两种实现,使用方法一致:
final IPLocation ipLocation = new IPLocation(filePath);
Location loc = ipl.fetchIPLocation("182.92.240.50");
System.out.printf("%s %s",loc.country,loc.area);
两种实现方式都不用重启就可实现升级qqwry.dat文件,只要用新文件将旧文件覆盖,程序会自动检查文件最后修改时间,若最后修改时间大于上一次时间,则重新加载数据文件,通过修改IPLocation类中的常量enableFileWatch=true来开启,默认是关闭的。
新格式如下:
+----------+
| 文件头 | (8字节) +----------+
| 记录区 | (不定长)
+----------+
| 索引区 | (大小由文件头决定)
+----------+
文件头:
+------------------------------+-----------------------------+
| first index position(4 bytes)|last index position(4 bytes) | +------------------------------+-----------------------------+
记录区:
+------------------+----------+------------------+----------+-----
| country1(n bytes)|\0(1 byte)| country2(n bytes)|\0(1 byte)|...
+------------------+----------+------------------+----------+-----
+------------------+----------+------------------+----------+-----
| area1(n bytes) |\0(1 byte)| area2(n bytes) |\0(1 byte)|...
+------------------+----------+------------------+----------+-----
索引区:
+------------+-------------------------+------------------------+
|ip1(4 bytes)|country position(3 bytes)| area position(3 bytes) |...
+------------+-------------------------+------------------------+
转换方法:
final IPFileConvertor convertor = new IPFileConvertor(IPFileConvertor.class.getResource("/qqwry.dat").getPath(),"./qqwry.dat");
convertor.convert();
新格式使用方法和之前一致,使用com.difeng.convert包下的解析类IPLocation解析即可。
输入文件格式如下,三列内容逗号分隔,ip放在第一列
124.126.138.233,北京市,电信
124.126.128.133,北京市,电信
124.126.139.233,北京市,电信
...
ip库文件 生成调用示例
File infile = new File("./ip_data.txt"); File outFile = new File("test.dat");
IPFileMaker iPFileMaker = new IPFileMaker( infile, outFile ); iPFileMaker.make();
使用制作好的ip库文件
IPFileSearcher iPFileSearcher = new IPFileSearcher("./test.dat");
System.out.println(iPFileSearcher.searchRecord("124.126.138.233"));