纯真IP数据库转txt
来源:互联网 发布:其言兹若人之俦乎的其 编辑:程序博客网 时间:2024/06/05 14:10
最近在解析ip数据库时,遇到一个问题。代码在本地可以运行,但是放在集群上时,却无法运行,问题可能出现在java 文件流无法加载hdfs 文件?之后转换下思路,试着先把ip解析出来。 主要代码来源于网上的一个博客,红色部分是本人修改部分
package ip;import java.io.*;import java.nio.ByteOrder;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import ip.LogFactory;import org.apache.log4j.Level;/** * Created by XNLEJ on 2017/10/25 0025. */public class IpSeeker { //����IP���ݿ��� private String IP_FILE="QQWry.Dat"; //������ļ��� private String INSTALL_DIR="f:/qqwry"; // һЩ�̶������������¼���ȵȵ� private static final int IP_RECORD_LENGTH = 7; private static final byte REDIRECT_MODE_1 = 0x01; private static final byte REDIRECT_MODE_2 = 0x02; // ������Ϊcache����ѯһ��ipʱ���Ȳ鿴cache���Լ��ٲ���Ҫ���ظ����� private Map<String, IPLocation> ipCache; // ����ļ������� private RandomAccessFile ipFile; // �ڴ�ӳ���ļ� private MappedByteBuffer mbb; // ��ʼ�����Ŀ�ʼ�ͽ����ľ���ƫ�� private long ipBegin, ipEnd; // Ϊ���Ч�ʶ����õ���ʱ���� private IPLocation loc; private byte[] buf; private byte[] b4; private byte[] b3; public IpSeeker(String fileName,String dir) { this.INSTALL_DIR=dir; this.IP_FILE=fileName; ipCache = new HashMap<String, IPLocation>(); loc = new IPLocation(); buf = new byte[1024]; b4 = new byte[4]; b3 = new byte[3]; try { ipFile = new RandomAccessFile(IP_FILE, "r"); } catch (FileNotFoundException e) { // ����Ҳ�������ļ����ٳ����ٵ�ǰĿ¼�����������ȫ������Сд�ļ��� // ��Ϊ��Щϵͳ�������ִ�Сд�����Ҳ���ip��ַ��Ϣ�ļ� String filename = new File(IP_FILE).getName().toLowerCase(); File[] files = new File(INSTALL_DIR).listFiles(); for(int i = 0; i < files.length; i++) { if(files[i].isFile()) { if(files[i].getName().toLowerCase().equals(filename)) { try { ipFile = new RandomAccessFile(files[i], "r"); } catch (FileNotFoundException e1) { LogFactory.log("IP��ַ��Ϣ�ļ�û���ҵ���IP��ʾ���ܽ���ʹ��",Level.ERROR,e1); ipFile = null; } break; } } } } // ������ļ��ɹ�����ȡ�ļ�ͷ��Ϣ if(ipFile != null) { try { ipBegin = readLong4(0); ipEnd = readLong4(4); if(ipBegin == -1 || ipEnd == -1) { ipFile.close(); ipFile = null; } } catch (IOException e) { LogFactory.log("IP��ַ��Ϣ�ļ���ʽ�д���IP��ʾ���ܽ���ʹ��",Level.ERROR,e); ipFile = null; } } } /** * ����һ���ص�IJ���ȫ���֣��õ�һϵ�а���s�Ӵ���IP��Χ��¼ * @param s �ص��Ӵ� * @return ����IPEntry���͵�List */ public List getIPEntriesDebug(String s) { List<IPEntry> ret = new ArrayList<IPEntry>(); long endOffset = ipEnd + 4; for(long offset = ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) { // ��ȡ����IPƫ�� long temp = readLong3(offset); // ���temp������-1����ȡIP�ĵص���Ϣ if(temp != -1) { IPLocation ipLoc = getIPLocation(temp); // �ж��Ƿ�����ص����������s�Ӵ�����������ˣ���������¼��List�У����û�У����� if(ipLoc.getCountry().indexOf(s) != -1 || ipLoc.getArea().indexOf(s) != -1) { IPEntry entry = new IPEntry(); entry.country = ipLoc.getCountry(); entry.area = ipLoc.getArea(); // �õ���ʼIP readIP(offset - 4, b4); entry.beginIp = Util.getIpStringFromBytes(b4); // �õ�����IP readIP(temp, b4); entry.endIp = Util.getIpStringFromBytes(b4); // ��Ӹü�¼ ret.add(entry); } } } return ret; } public IPLocation getIPLocation(String ip){ IPLocation location=new IPLocation(); location.setArea(this.getArea(ip)); location.setCountry(this.getCountry(ip)); return location; } /** * ����һ���ص�IJ���ȫ���֣��õ�һϵ�а���s�Ӵ���IP��Χ��¼ * @param s �ص��Ӵ� * @return ����IPEntry���͵�List */ public List<IPEntry> getIPEntries(String s) { List<IPEntry> ret = new ArrayList<IPEntry>(); try { // ӳ��IP��Ϣ�ļ����ڴ��� if(mbb == null) { FileChannel fc = ipFile.getChannel(); mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ipFile.length()); mbb.order(ByteOrder.LITTLE_ENDIAN); } int endOffset = (int)ipEnd; for(int offset = (int)ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) { int temp = readInt3(offset); if(temp != -1) { IPLocation ipLoc = getIPLocation(temp); // �ж��Ƿ�����ص����������s�Ӵ�����������ˣ���������¼��List�У����û�У����� if(ipLoc.getCountry().indexOf(s) != -1 || ipLoc.getArea().indexOf(s) != -1) { IPEntry entry = new IPEntry(); entry.country = ipLoc.getCountry(); entry.area = ipLoc.getArea(); // �õ���ʼIP readIP(offset - 4, b4); entry.beginIp = Util.getIpStringFromBytes(b4); // �õ�����IP readIP(temp, b4); entry.endIp = Util.getIpStringFromBytes(b4); // ��Ӹü�¼ ret.add(entry); } } } } catch (IOException e) { LogFactory.log("",Level.ERROR,e); } return ret; } /** * ���ڴ�ӳ���ļ���offsetλ�ÿ�ʼ��3���ֽڶ�ȡһ��int * @param offset * @return */ private int readInt3(int offset) { mbb.position(offset); return mbb.getInt() & 0x00FFFFFF; } /** * ���ڴ�ӳ���ļ��ĵ�ǰλ�ÿ�ʼ��3���ֽڶ�ȡһ��int * @return */ private int readInt3() { return mbb.getInt() & 0x00FFFFFF; } /** * ����IP�õ������� * @param ip ip���ֽ�������ʽ * @return �������ַ��� */ public String getCountry(byte[] ip) { // ���ip��ַ�ļ��Ƿ����� if(ipFile == null) return Message.bad_ip_file; // ����ip��ת��ip�ֽ�����Ϊ�ַ�����ʽ String ipStr = Util.getIpStringFromBytes(ip); // �ȼ��cache���Ƿ��Ѿ����������ip�Ľ����û���������ļ� if(ipCache.containsKey(ipStr)) { IPLocation ipLoc = ipCache.get(ipStr); return ipLoc.getCountry(); } else { IPLocation ipLoc = getIPLocation(ip); ipCache.put(ipStr, ipLoc.getCopy()); return ipLoc.getCountry(); } } /** * ����IP�õ������� * @param ip IP���ַ�����ʽ * @return �������ַ��� */ public String getCountry(String ip) { return getCountry(Util.getIpByteArrayFromString(ip)); } /** * ����IP�õ������� * @param ip ip���ֽ�������ʽ * @return �������ַ��� */ public String getArea(byte[] ip) { // ���ip��ַ�ļ��Ƿ����� if(ipFile == null) return Message.bad_ip_file; // ����ip��ת��ip�ֽ�����Ϊ�ַ�����ʽ String ipStr = Util.getIpStringFromBytes(ip); // �ȼ��cache���Ƿ��Ѿ����������ip�Ľ����û���������ļ� if(ipCache.containsKey(ipStr)) { IPLocation ipLoc = ipCache.get(ipStr); return ipLoc.getArea(); } else { IPLocation ipLoc = getIPLocation(ip); ipCache.put(ipStr, ipLoc.getCopy()); return ipLoc.getArea(); } } /** * ����IP�õ������� * @param ip IP���ַ�����ʽ * @return �������ַ��� */ public String getArea(String ip) { return getArea(Util.getIpByteArrayFromString(ip)); } /** * ����ip����ip��Ϣ�ļ����õ�IPLocation�ṹ����������ip���������Աip�еõ� * @param ip Ҫ��ѯ��IP * @return IPLocation�ṹ */ private IPLocation getIPLocation(byte[] ip) { IPLocation info = null; long offset = locateIP(ip); if(offset != -1) info = getIPLocation(offset); if(info == null) { info = new IPLocation(); info.setCountry ( Message.unknown_country); info.setArea(Message.unknown_area); } return info; } /** * ��offsetλ�ö�ȡ4���ֽ�Ϊһ��long����ΪjavaΪbig-endian��ʽ������û�취 * ������ôһ����������ת�� * @param offset * @return ��ȡ��longֵ������-1��ʾ��ȡ�ļ�ʧ�� */ private long readLong4(long offset) { long ret = 0; try { ipFile.seek(offset); ret |= (ipFile.readByte() & 0xFF); ret |= ((ipFile.readByte() << 8) & 0xFF00); ret |= ((ipFile.readByte() << 16) & 0xFF0000); ret |= ((ipFile.readByte() << 24) & 0xFF000000); return ret; } catch (IOException e) { return -1; } } /** * ��offsetλ�ö�ȡ3���ֽ�Ϊһ��long����ΪjavaΪbig-endian��ʽ������û�취 * ������ôһ����������ת�� * @param offset ��������ʼƫ�� * @return ��ȡ��longֵ������-1��ʾ��ȡ�ļ�ʧ�� */ private long readLong3(long offset) { long ret = 0; try { ipFile.seek(offset); ipFile.readFully(b3); ret |= (b3[0] & 0xFF); ret |= ((b3[1] << 8) & 0xFF00); ret |= ((b3[2] << 16) & 0xFF0000); return ret; } catch (IOException e) { return -1; } } /** * �ӵ�ǰλ�ö�ȡ3���ֽ�ת����long * @return ��ȡ��longֵ������-1��ʾ��ȡ�ļ�ʧ�� */ private long readLong3() { long ret = 0; try { ipFile.readFully(b3); ret |= (b3[0] & 0xFF); ret |= ((b3[1] << 8) & 0xFF00); ret |= ((b3[2] << 16) & 0xFF0000); return ret; } catch (IOException e) { return -1; } } /** * ��offsetλ�ö�ȡ�ĸ��ֽڵ�ip��ַ����ip�����У���ȡ���ipΪbig-endian��ʽ������ * �ļ�����little-endian��ʽ���������ת�� * @param offset * @param ip */ private void readIP(long offset, byte[] ip) { try { ipFile.seek(offset); ipFile.readFully(ip); byte temp = ip[0]; ip[0] = ip[3]; ip[3] = temp; temp = ip[1]; ip[1] = ip[2]; ip[2] = temp; } catch (IOException e) { LogFactory.log("",Level.ERROR,e); } } /** * ��offsetλ�ö�ȡ�ĸ��ֽڵ�ip��ַ����ip�����У���ȡ���ipΪbig-endian��ʽ������ * �ļ�����little-endian��ʽ���������ת�� * @param offset * @param ip */ private void readIP(int offset, byte[] ip) { mbb.position(offset); mbb.get(ip); byte temp = ip[0]; ip[0] = ip[3]; ip[3] = temp; temp = ip[1]; ip[1] = ip[2]; ip[2] = temp; } /** * �����Աip��beginIp�Ƚϣ�ע�����beginIp��big-endian�� * @param ip Ҫ��ѯ��IP * @param beginIp �ͱ���ѯIP��Ƚϵ�IP * @return ��ȷ���0��ip����beginIp�
阅读全文
0 0
- 纯真IP数据库转txt
- [转]纯真IP数据库格式详解
- 纯真ip数据库dat转mdb
- [转]纯真IP数据库格式详解
- 读取纯真IP数据库
- 纯真IP数据库查询代码
- 纯真IP数据库格式详解
- 读取纯真IP数据库代码
- 纯真IP数据库格式详解
- delphi读取纯真IP数据库
- 纯真IP数据库格式详解
- 纯真IP数据库格式详解
- 纯真IP数据库格式详解
- 纯真IP数据库格式详解
- C#读取纯真IP数据库
- 纯真IP数据库格式详解
- 纯真IP数据库格式详解
- 纯真IP数据库格式详解
- c#中关于Datatime在定时中的应用与启发
- Windows使用VNC viewer访问Ubuntu 14.04远程桌面的简单方法
- 服务器常见错误代码500、501、502、503、504、505
- 技术分享连载(六十五)
- 每年服务200多家创企,他总结了一套投资人最爱的BP要诀丨72问
- 纯真IP数据库转txt
- C# String与StringBuilder
- vim常用快捷键
- Django 速成
- Ubuntu下安装MySQL及简单操作
- 金蝶EAS客户端隐藏快捷键
- Feature Selection: A Data Perspective --阅读笔记1 特征选择的概述
- 新飞冰箱的死亡启示录
- Android_MVP优化