纯真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� 
原创粉丝点击