常用工具类合集-持续完善

 

常用工具类-持续完善

1.Map工具类  模糊匹配key

import org.apache.commons.collections.MapUtils;

import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * map工具类
 */
public class BusMapUtils {
    /**
     * 从map中查询想要的map项,根据模糊key
     */
    public static Map<String, Object> parseMapForFilter(Map<String, Object> map, String filters) {
        if (map == null) {
            return null;
        } else {
            map = map.entrySet().stream()
                    .filter((e) -> checkKey(e.getKey(),filters))
                    .collect(Collectors.toMap(
                            (e) -> (String) e.getKey(),
                            (e) -> e.getValue()
                    ));
        }
        return map;
    }

    /**
     * 从map中查询想要的map项,根据模糊key
     */
    public static String mapFilterFindFirstValue(Map<String, String> map, String filters) {
        if (map == null) {
            return null;
        } else {
            Optional<Map.Entry<String, String>> first = map.entrySet().stream()
                    .filter((e) -> checkKey(e.getKey(), filters) && null != e.getValue())
                    .collect(Collectors.toMap(
                            (e) -> e.getKey(),
                            (e) -> String.valueOf(e.getValue())
                    )).entrySet().stream().findFirst();
            if (first.isPresent()) {
                return String.valueOf(first.get().getValue());
            }else{
                return "";
            }
        }
    }

    /**
     * 通过indexof匹配想要查询的字符
     */
    private static boolean checkKey(String key,String filters) {
        if (key.indexOf(filters)>-1){
            return true;
        }else {
            return false;
        }
    }
}
View Code

2.压缩GZip工具类

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.codec.binary.StringUtils;


    public class GzipUtil {

        public static final String GZIP_ENCODE_UTF_8 = "UTF-8";

        public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";

        /**
         * 字符串压缩为GZIP字节数组
         *
         * @param str
         * @return
         */
        public static byte[] compress(String str) {
            return compress(str, GZIP_ENCODE_UTF_8);
        }

        /**
         * 字符串压缩为GZIP字节数组
         *
         * @param str
         * @param encoding
         * @return
         */
        public static byte[] compress(String str, String encoding) {
            if (str == null || str.length() == 0) {
                return null;
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            GZIPOutputStream gzip;
            try {
                gzip = new GZIPOutputStream(out);
                gzip.write(str.getBytes(encoding));
                gzip.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return out.toByteArray();
        }

        /**
         * GZIP解压缩
         *
         * @param bytes
         * @return
         */
        public static byte[] uncompress(byte[] bytes) {
            if (bytes == null || bytes.length == 0) {
                return null;
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            try {
                GZIPInputStream ungzip = new GZIPInputStream(in);
                byte[] buffer = new byte[256];
                int n;
                while ((n = ungzip.read(buffer)) >= 0) {
                    out.write(buffer, 0, n);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            return out.toByteArray();
        }

        /**
         *
         * @param bytes
         * @return
         */
        public static String uncompressToString(byte[] bytes) {
            return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
        }

        /**
         *
         * @param bytes
         * @param encoding
         * @return
         */
        public static String uncompressToString(byte[] bytes, String encoding) {
            if (bytes == null || bytes.length == 0) {
                return null;
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            try {
                GZIPInputStream ungzip = new GZIPInputStream(in);
                byte[] buffer = new byte[256];
                int n;
                while ((n = ungzip.read(buffer)) >= 0) {
                    out.write(buffer, 0, n);
                }
                return out.toString(encoding);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        public static String compress2(String str) {
            if (str == null || str.length() == 0) {
                return str;
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            GZIPOutputStream gzip = null;
            try {
                gzip = new GZIPOutputStream(out);
                gzip.write(str.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (gzip != null) {
                    try {
                        gzip.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }//加入Java开发交流君样:756584822一起吹水聊天
                }
            }
            return new sun.misc.BASE64Encoder().encode(out.toByteArray());
        }

        /**
         * 使用gzip解压缩
         * @param compressedStr 压缩字符串
         * @return
         */
        public static byte[] uncompress2(String compressedStr) {
            if (compressedStr == null) {
                return null;
            }

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ByteArrayInputStream in = null;
            GZIPInputStream ginzip = null;
            byte[] compressed = null;
            String decompressed = null;

            byte[] zbytes = null;
            try {
                compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
                in = new ByteArrayInputStream(compressed);
                ginzip = new GZIPInputStream(in);
                byte[] buffer = new byte[1024];
                int offset = -1;
                while ((offset = ginzip.read(buffer)) != -1) {
                    out.write(buffer, 0, offset);
                }
                zbytes = out.toByteArray();
                //decompressed = out.toString();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ginzip != null) {
                    try {
                        ginzip.close();
                    } catch (IOException e) {
                    }//加入Java开发交流君样:756584822一起吹水聊天
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                    }
                }
            }
            return zbytes;
        }


        public static void main2(String[] args) {
            String str ="{\n" +
                    "\t\"url\": \"/auth/crec/code\",\n" +
                    "\t\"srcIp\": \"10.81.107.84\",\n" +
                    "\t\"srcPort\": \"58457\",\n" +
                    "\t\"dstIp\": \"10.2.244.219\",\n" +
                    "\t\"dstPort\": \"80\"}";
            System.out.println("原长度:" + str.length());
            System.out.println("压缩后字符串长度:" + GzipUtil.compress(str).toString().length());
            //System.out.println("解压缩后字符串:" + StringUtils.newStringUtf8(GzipUtil.uncompress(GzipUtil.compress(str))));
            System.out.println("压缩后字符串:"+GzipUtil.compress(str).toString());
            System.out.println("解压缩后字符串:" + GzipUtil.uncompressToString(GzipUtil.compress(str)));
        }

        public static void main(String[] args) {
            String ss = "asdfzxcv";
            System.out.println(ss.indexOf("asd"));
            System.out.println(ss.indexOf("zxc"));
            System.out.println(ss.indexOf("gggggggg"));
        }
    }
View Code

3.EncodeUtil

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringEscapeUtils;

import java.net.URLDecoder;
import java.net.URLEncoder;

public class EncodeUtil {
    private static final String DEFAULT_URL_ENCODING = "UTF-8";
    private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();

    /**
     * Hex编码.
     */
    public static String encodeHex(byte[] input) {
        return new String(Hex.encodeHex(input));
    }

    /**
     * Hex解码.
     */
    public static byte[] decodeHex(String input) {
        try {
            return Hex.decodeHex(input.toCharArray());
        } catch (DecoderException e) {
            return null;
        }
    }

    /**
     * Base64编码.
     */
    public static String encodeBase64(byte[] input) {
        return new String(Base64.encodeBase64(input));
    }

    /**
     * Base64编码.
     */
    public static String encodeBase64(String input) {
        try {
            return new String(Base64.encodeBase64(input.getBytes(DEFAULT_URL_ENCODING)));
        } catch (Exception e) {
            return "";
        }
    }

//    /**
//     * Base64编码, URL安全(将Base64中的URL非法字符'+'和'/'转为'-'和'_', 见RFC3548).
//     */
//    public static String encodeUrlSafeBase64(byte[] input) {
//        return Base64.encodeBase64URLSafe(input);
//    }

    /**
     * Base64解码.
     */
    public static byte[] decodeBase64(String input) {
        return Base64.decodeBase64(input.getBytes());
    }

    /**
     * Base64解码.
     */
    public static String decodeBase64String(String input) {
        try {
            return new String(Base64.decodeBase64(input.getBytes()), DEFAULT_URL_ENCODING);
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * Base62编码。
     */
    public static String encodeBase62(byte[] input) {
        char[] chars = new char[input.length];
        for (int i = 0; i < input.length; i++) {
            chars[i] = BASE62[((input[i] & 0xFF) % BASE62.length)];
        }
        return new String(chars);
    }

    /**
     * Html 转码.
     */
    public static String escapeHtml(String html) {
        return StringEscapeUtils.escapeHtml4(html);
    }

    /**
     * Html 解码.
     */
    public static String unescapeHtml(String htmlEscaped) {
        return StringEscapeUtils.unescapeHtml4(htmlEscaped);
    }

    /**
     * Xml 转码.
     */
    public static String escapeXml(String xml) {
        return StringEscapeUtils.escapeXml(xml);
    }

    /**
     * Xml 解码.
     */
    public static String unescapeXml(String xmlEscaped) {
        return StringEscapeUtils.unescapeXml(xmlEscaped);
    }

    /**
     * URL 编码, Encode默认为UTF-8.
     */
    public static String urlEncode(String part) {
        try {
            return URLEncoder.encode(part, DEFAULT_URL_ENCODING);
        } catch (Exception e) {
            return  "";
        }
    }

    /**
     * URL 解码, Encode默认为UTF-8.
     */
    public static String urlDecode(String part) {
        try {
            return URLDecoder.decode(part, DEFAULT_URL_ENCODING);
        } catch (Exception e) {
            return  "";
        }
    }

    public static void main(String[] args) {
        String ss = " headerShow=false; service-mall-accesstoken=!TLZayV-T-i4R-oMhJPqn9SAN3fV8PS-WkIVu2qs_L4j_1dl8oskJtMT5yfUK0sHzXHTj_9Ng97enwdedYDOWcpfynReWC4jfSNuTcj5jDWlfc159xrdDtduxKoXJrFeZyCpZyT5F254oXjLGiV-2VIfg%3D%3D; service-mall-refreshtoken=303e86979bbb42c0a0780817425bfcdf; service-mall-userInfo=%7B%22psnId%22%3A%2232%22%2C%22name%22%3A%22%E5%AE%8B%E6%99%A8%E9%98%B3%22%2C%22tel%22%3Anull%2C%22mobile%22%3A%2218634690452%22%2C%22certType%22%3A%2201%22%2C%22certNo%22%3A%22142723199703013010%22%2C%22gend%22%3Anull%2C%22email%22%3Anull%2C%22naty%22%3Anull%2C%22resdAddr%22%3Anull%2C%22brdy%22%3Anull%2C%22crtfState%22%3A%222%22%2C%22crter%22%3Anull%2C%22crterName%22%3Anull%2C%22crteTime%22%3A1618991825000%2C%22crteIns%22%3Anull%2C%22opter%22%3Anull%2C%22opterName%22%3Anull%2C%22optTime%22%3Anull%2C%22optins%22%3Anull%2C%22poolarea%22%3Anull%2C%22dscr%22%3Anull%2C%22authCode%22%3A%22%22%2C%22cretAuth%22%3Afalse%2C%22type%22%3A%22person%22%2C%22loginTel%22%3A%2218634690452%22%2C%22prof%22%3A%7B%22certno%22%3Anull%2C%22psnCertType%22%3Anull%2C%22profNo%22%3A%2214000000000000006006%22%2C%22psnNo%22%3A%2214000000000000000000022030%22%2C%22profName%22%3A%22%E5%AE%8B%E6%99%A8%E9%98%B3%22%2C%22offTel%22%3A%220359-1111111%22%2C%22gend%22%3A%221%22%2C%22currDuty%22%3A%22%E6%B5%8B%E8%AF%95%22%2C%22profType%22%3A%221%22%2C%22dept%22%3Anull%2C%22profDoma%22%3A%2211%22%2C%22profarea%22%3A%2211%22%2C%22proTechProfttl%22%3A%22410%22%2C%22uscc%22%3Anull%2C%22empName%22%3Anull%2C%22profttlJobBegntime%22%3Anull%2C%22itro%22%3Anull%2C%22empAddr%22%3Anull%2C%22begntime%22%3A%222021-04-29%22%2C%22endtime%22%3Anull%2C%22valiFlag%22%3A%221%22%2C%22admdvs%22%3A%22140000%22%2C%22empprofFileAddr%22%3Anull%2C%22mob%22%3A%2218634690452%22%2C%22email%22%3A%22scyzry%40126.com%22%2C%22poscode%22%3A%22000000%22%2C%22dclaWay%22%3Anull%2C%22rid%22%3A%22140000202104291043193200009078%22%2C%22crteTime%22%3A%222021-04-29%22%2C%22updtTime%22%3A%222021-04-29%22%2C%22crter%22%3Anull%2C%22crterName%22%3A%22%E5%AE%8B%E6%99%A8%E9%98%B3%22%2C%22crteOptins%22%3Anull%2C%22opter%22%3Anull%2C%22opterName%22%3A%22%E5%AE%8B%E6%99%A8%E9%98%B3%22%2C%22optTime%22%3A%222021-04-29%22%2C%22optins%22%3Anull%2C%22ver%22%3A%221.0%22%2C%22radioId%22%3A0%7D%7D; headerStatus=0; SESSION_FLAG=1";
        System.out.println(urlDecode(ss));
    }
}
View Code

4.身份证工具类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 〈一句话功能简述〉<br>
 * 〈〉
 *
 * @author Admin
 * @create 2019/10/14
 * @since 1.0.0
 */
public class IdentityDocumentUtil {

    /** 中国公民身份证号码最小长度。 */
    private static final int CHINA_ID_MIN_LENGTH = 15;

    /** 中国公民身份证号码最大长度。 */
    private static final int CHINA_ID_MAX_LENGTH = 18;

    /** 省、直辖市代码表 */
    private static final String cityCode[] = {
            "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",
            "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71",
            "81", "82", "91"
    };

    /** 每位加权因子 */
    private static final int power[] = {
            7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
    };

    /** 第18位校检码 */
    private static final String verifyCode[] = {
            "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
    };
    /** 最低年限 */
    private static final int MIN = 1930;
    private static Map<String, String> cityCodes = new HashMap<String, String>();
    /** 台湾身份首字母对应数字 */
    private static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();
    /** 香港身份首字母对应数字 */
    private static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();
    static {
        cityCodes.put("11", "北京");
        cityCodes.put("12", "天津");
        cityCodes.put("13", "河北");
        cityCodes.put("14", "山西");
        cityCodes.put("15", "内蒙古");
        cityCodes.put("21", "辽宁");
        cityCodes.put("22", "吉林");
        cityCodes.put("23", "黑龙江");
        cityCodes.put("31", "上海");
        cityCodes.put("32", "江苏");
        cityCodes.put("33", "浙江");
        cityCodes.put("34", "安徽");
        cityCodes.put("35", "福建");
        cityCodes.put("36", "江西");
        cityCodes.put("37", "山东");
        cityCodes.put("41", "河南");
        cityCodes.put("42", "湖北");
        cityCodes.put("43", "湖南");
        cityCodes.put("44", "广东");
        cityCodes.put("45", "广西");
        cityCodes.put("46", "海南");
        cityCodes.put("50", "重庆");
        cityCodes.put("51", "四川");
        cityCodes.put("52", "贵州");
        cityCodes.put("53", "云南");
        cityCodes.put("54", "西藏");
        cityCodes.put("61", "陕西");
        cityCodes.put("62", "甘肃");
        cityCodes.put("63", "青海");
        cityCodes.put("64", "宁夏");
        cityCodes.put("65", "新疆");
        cityCodes.put("71", "台湾");
        cityCodes.put("81", "香港");
        cityCodes.put("82", "澳门");
        cityCodes.put("91", "国外");
        twFirstCode.put("A", 10);
        twFirstCode.put("B", 11);
        twFirstCode.put("C", 12);
        twFirstCode.put("D", 13);
        twFirstCode.put("E", 14);
        twFirstCode.put("F", 15);
        twFirstCode.put("G", 16);
        twFirstCode.put("H", 17);
        twFirstCode.put("J", 18);
        twFirstCode.put("K", 19);
        twFirstCode.put("L", 20);
        twFirstCode.put("M", 21);
        twFirstCode.put("N", 22);
        twFirstCode.put("P", 23);
        twFirstCode.put("Q", 24);
        twFirstCode.put("R", 25);
        twFirstCode.put("S", 26);
        twFirstCode.put("T", 27);
        twFirstCode.put("U", 28);
        twFirstCode.put("V", 29);
        twFirstCode.put("X", 30);
        twFirstCode.put("Y", 31);
        twFirstCode.put("W", 32);
        twFirstCode.put("Z", 33);
        twFirstCode.put("I", 34);
        twFirstCode.put("O", 35);
        hkFirstCode.put("A", 1);
        hkFirstCode.put("B", 2);
        hkFirstCode.put("C", 3);
        hkFirstCode.put("R", 18);
        hkFirstCode.put("U", 21);
        hkFirstCode.put("Z", 26);
        hkFirstCode.put("X", 24);
        hkFirstCode.put("W", 23);
        hkFirstCode.put("O", 15);
        hkFirstCode.put("N", 14);
    }

    /**
     * 验证身份证是否合法
     */
    public static boolean validateCard(String idCard) {
        String card = idCard.trim();
        if (validateIdCard18(card)) {
            return true;
        }
        if (validateIdCard15(card)) {
            return true;
        }
        String[] cardval = validateIdCard10(card);
        if (cardval != null) {
            if (cardval[2].equals("true")) {
                return true;
            }
        }
        return false;
    }


    /**
     * 根据身份编号获取年龄
     * @param idCard 身份编号
     * @return 年龄
     */
    public static int getAgeByIdCard(String idCard) {
        int iAge = 0;
        if (idCard.length() == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        String year = idCard.substring(6, 10);
        Calendar cal = Calendar.getInstance();
        int iCurrYear = cal.get(Calendar.YEAR);
        iAge = iCurrYear - Integer.valueOf(year);
        return iAge;
    }

    /**
     * 根据身份编号获取生日
     * @param idCard 身份编号
     * @return 生日(yyyyMMdd)
     */
    public static String getBirthByIdCard(String idCard) {
        Integer len = idCard.length();
        if (len < CHINA_ID_MIN_LENGTH) {
            return null;
        } else if (len == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        return idCard.substring(6, 14);
    }

    /**
     * 根据身份编号获取生日年
     * @param idCard 身份编号
     * @return 生日(yyyy)
     */
    public static Short getYearByIdCard(String idCard) {
        Integer len = idCard.length();
        if (len < CHINA_ID_MIN_LENGTH) {
            return null;
        } else if (len == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        return Short.valueOf(idCard.substring(6, 10));
    }

    /**
     * 根据身份编号获取生日月
     * @param idCard 身份编号
     * @return 生日(MM)
     */
    public static Short getMonthByIdCard(String idCard) {
        Integer len = idCard.length();
        if (len < CHINA_ID_MIN_LENGTH) {
            return null;
        } else if (len == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        return Short.valueOf(idCard.substring(10, 12));
    }

    /**
     * 根据身份编号获取生日天
     * @param idCard 身份编号
     * @return 生日(dd)
     */
    public static Short getDateByIdCard(String idCard) {
        Integer len = idCard.length();
        if (len < CHINA_ID_MIN_LENGTH) {
            return null;
        } else if (len == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        return Short.valueOf(idCard.substring(12, 14));
    }

    /**
     * 根据身份编号获取性别
     * @param idCard 身份编号
     * @return 性别(M-男,F-女,N-未知)
     */
    public static String getGenderByIdCard(String idCard) {
        String sGender = "N";
        if (idCard.length() == CHINA_ID_MIN_LENGTH) {
            idCard = conver15CardTo18(idCard);
        }
        String sCardNum = idCard.substring(16, 17);
        if (Integer.parseInt(sCardNum) % 2 != 0) {
            sGender = "M";
        } else {
            sGender = "F";
        }
        return sGender;
    }

    /**
     * 根据身份编号获取户籍省份
     * @param idCard 身份编码
     * @return 省级编码。
     */
    public static String getProvinceByIdCard(String idCard) {
        int len = idCard.length();
        String sProvince = null;
        String sProvinNum = "";
        if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
            sProvinNum = idCard.substring(0, 2);
        }
        sProvince = cityCodes.get(sProvinNum);
        return sProvince;
    }

    //----------------------------------------------------------------------------------------------
    /**
     * 将15位身份证号码转换为18位
     * @param idCard 15位身份编码
     * @return 18位身份编码
     */
    private static String conver15CardTo18(String idCard) {
        String idCard18 = "";
        if (idCard.length() != CHINA_ID_MIN_LENGTH) {
            return null;
        }
        if (isNum(idCard)) {
            // 获取出生年月日
            String birthday = idCard.substring(6, 12);
            Date birthDate = null;
            try {
                birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            Calendar cal = Calendar.getInstance();
            if (birthDate != null)
                cal.setTime(birthDate);
            // 获取出生年(完全表现形式,如:2010)
            String sYear = String.valueOf(cal.get(Calendar.YEAR));
            idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);
            // 转换字符数组
            char[] cArr = idCard18.toCharArray();
            if (cArr != null) {
                int[] iCard = converCharToInt(cArr);
                int iSum17 = getPowerSum(iCard);
                // 获取校验位
                String sVal = getCheckCode18(iSum17);
                if (sVal.length() > 0) {
                    idCard18 += sVal;
                } else {
                    return null;
                }
            }
        } else {
            return null;
        }
        return idCard18;
    }

    /**
     * 验证18位身份编码是否合法
     * @param idCard 身份编码
     * @return 是否合法
     */
    private static boolean validateIdCard18(String idCard) {
        boolean bTrue = false;
        if (idCard.length() == CHINA_ID_MAX_LENGTH) {
            // 前17位
            String code17 = idCard.substring(0, 17);
            // 第18位
            String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);
            if (isNum(code17)) {
                char[] cArr = code17.toCharArray();
                if (cArr != null) {
                    int[] iCard = converCharToInt(cArr);
                    int iSum17 = getPowerSum(iCard);
                    // 获取校验位
                    String val = getCheckCode18(iSum17);
                    if (val.length() > 0) {
                        if (val.equalsIgnoreCase(code18)) {
                            bTrue = true;
                        }
                    }
                }
            }
        }
        return bTrue;
    }

    /**
     * 验证15位身份编码是否合法
     * @param idCard 身份编码
     * @return 是否合法
     */
    private static boolean validateIdCard15(String idCard) {
        if (idCard.length() != CHINA_ID_MIN_LENGTH) {
            return false;
        }
        if (isNum(idCard)) {
            String proCode = idCard.substring(0, 2);
            if (cityCodes.get(proCode) == null) {
                return false;
            }
            String birthCode = idCard.substring(6, 12);
            Date birthDate = null;
            try {
                birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            Calendar cal = Calendar.getInstance();
            if (birthDate != null)
                cal.setTime(birthDate);
            if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)),
                    Integer.valueOf(birthCode.substring(4, 6)))) {
                return false;
            }
        } else {
            return false;
        }
        return true;
    }

    /**
     * 验证10位身份编码是否合法
     * @param idCard 身份编码
     * @return 身份证信息数组
     *         [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false)
     *         若不是身份证件号码则返回null
     */
    private static String[] validateIdCard10(String idCard) {
        String[] info = new String[3];
        String card = idCard.replaceAll("[\\(|\\)]", "");
        if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {
            return null;
        }
        if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 台湾
            info[0] = "台湾";
            String char2 = idCard.substring(1, 2);
            if (char2.equals("1")) {
                info[1] = "M";
            } else if (char2.equals("2")) {
                info[1] = "F";
            } else {
                info[1] = "N";
                info[2] = "false";
                return info;
            }
            info[2] = validateTWCard(idCard) ? "true" : "false";
        } else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?$")) { // 澳门
            info[0] = "澳门";
            info[1] = "N";
            // TODO
        } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) { // 香港
            info[0] = "香港";
            info[1] = "N";
            info[2] = validateHKCard(idCard) ? "true" : "false";
        } else {
            return null;
        }
        return info;
    }

    /**
     * 验证台湾身份证号码
     * @param idCard 身份证号码
     * @return 验证码是否符合
     */
    private static boolean validateTWCard(String idCard) {
        String start = idCard.substring(0, 1);
        String mid = idCard.substring(1, 9);
        String end = idCard.substring(9, 10);
        Integer iStart = twFirstCode.get(start);
        Integer sum = iStart / 10 + (iStart % 10) * 9;
        char[] chars = mid.toCharArray();
        Integer iflag = 8;
        for (char c : chars) {
            sum = sum + Integer.valueOf(c + "") * iflag;
            iflag--;
        }
        return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;
    }

    /**
     * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
     * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35
     * 最后一位校验码为0-9的数字加上字符"A","A"代表10
     * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
     * @param idCard 身份证号码
     * @return 验证码是否符合
     */
    private static boolean validateHKCard(String idCard) {
        String card = idCard.replaceAll("[\\(|\\)]", "");
        Integer sum = 0;
        if (card.length() == 9) {
            sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9
                    + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;
            card = card.substring(1, 9);
        } else {
            sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;
        }
        String mid = card.substring(1, 7);
        String end = card.substring(7, 8);
        char[] chars = mid.toCharArray();
        Integer iflag = 7;
        for (char c : chars) {
            sum = sum + Integer.valueOf(c + "") * iflag;
            iflag--;
        }
        if (end.toUpperCase().equals("A")) {
            sum = sum + 10;
        } else {
            sum = sum + Integer.valueOf(end);
        }
        return (sum % 11 == 0) ? true : false;
    }

    /**
     * 将字符数组转换成数字数组
     * @param ca 字符数组
     * @return 数字数组
     */
    private static int[] converCharToInt(char[] ca) {
        int len = ca.length;
        int[] iArr = new int[len];
        try {
            for (int i = 0; i < len; i++) {
                iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return iArr;
    }

    /**
     * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
     * @param iArr
     * @return 身份证编码。
     */
    private static int getPowerSum(int[] iArr) {
        int iSum = 0;
        if (power.length == iArr.length) {
            for (int i = 0; i < iArr.length; i++) {
                for (int j = 0; j < power.length; j++) {
                    if (i == j) {
                        iSum = iSum + iArr[i] * power[j];
                    }
                }
            }
        }
        return iSum;
    }

    /**
     * 将power和值与11取模获得余数进行校验码判断
     * @param iSum
     * @return 校验位
     */
    private static String getCheckCode18(int iSum) {
        String sCode = "";
        switch (iSum % 11) {
            case 10:
                sCode = "2";
                break;
            case 9:
                sCode = "3";
                break;
            case 8:
                sCode = "4";
                break;
            case 7:
                sCode = "5";
                break;
            case 6:
                sCode = "6";
                break;
            case 5:
                sCode = "7";
                break;
            case 4:
                sCode = "8";
                break;
            case 3:
                sCode = "9";
                break;
            case 2:
                sCode = "x";
                break;
            case 1:
                sCode = "0";
                break;
            case 0:
                sCode = "1";
                break;
        }
        return sCode;
    }
    /**
     * 数字验证
     * @param val
     * @return 提取的数字。
     */
    private static boolean isNum(String val) {
        return val == null || "".equals(val) ? false : val.matches("^[0-9]*$");
    }

    /**
     * 验证小于当前日期 是否有效
     * @param iYear 待验证日期(年)
     * @param iMonth 待验证日期(月 1-12)
     * @param iDate 待验证日期(日)
     * @return 是否有效
     */
    private static boolean valiDate(int iYear, int iMonth, int iDate) {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int datePerMonth;
        if (iYear < MIN || iYear >= year) {
            return false;
        }
        if (iMonth < 1 || iMonth > 12) {
            return false;
        }
        switch (iMonth) {
            case 4:
            case 6:
            case 9:
            case 11:
                datePerMonth = 30;
                break;
            case 2:
                boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0))
                        && (iYear > MIN && iYear < year);
                datePerMonth = dm ? 29 : 28;
                break;
            default:
                datePerMonth = 31;
        }
        return (iDate >= 1) && (iDate <= datePerMonth);
    }

    /**
     * 测试,及使用(验证身份证是否合法)
     * @param args
     */
    public static void main(String[] args){
        System.out.println(validateCard("490927199713124022"));
        System.out.println(validateCard("N6340588"));
    }


}
View Code

5.IP工具类

import org.apache.commons.lang.StringUtils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 与ip相关的工具类
 *     1, IpLong2Str 把长整型的IP转化为字符串形式
 *  2, IpInt2Str 把整型的IP转化为字符串形式
 *  3, IpStr2Long 把IP字符串转化为长整型
 *  4, IpStr2Int 把IP字符串转化为整型
 *  5, getIpRange(String[] includeIp, String[] excludeIp)
 *  6, getIpRange(String includeIp, String excludeIp) 把包含IP串和排除IP串合并成一个不重复的IP段
 *  7, ipRanges2IpString(List<IpRange>) 将ipRanges 转化为 10.10.10.10-10.10.10.11,...
 *  8, chuChong(List<IpRange> listIpRange)
 *  9, ipString2Number 将字符串IP转换成整数IP
 *  10, ipNumber2String(Long) 将一个整数转换成其相对应的使用‘点分法’表示的IP,如127.0.0.1
 *  11, isIPV4(String s) IP格式验证

 * @version $Revision: 3542 $, $Date: 2015-7-9 下午2:12:14$
 * @LastChanged $Author: miweidong $, $Date:: 2017-07-04 14:47:34#$
 */
public class IpTools {
    
  public static String local_ip;
  
  static {
    try {
      local_ip = InetAddress.getLocalHost().getHostAddress();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
  }
  
    /**
     * 把长整型的IP转化为字符串形式,IP以字符串方式传入。
     * 如果ipLongStr为空或者不全是数字,直接返回ipLongStr
     */
  @Deprecated
    public static String IpLong2Str(String ipLongStr) {
        if(StringUtils.isBlank(ipLongStr) || !StringUtils.isNumeric(ipLongStr)){
            return ipLongStr;
        }
        
        Long ipLong = Long.valueOf(ipLongStr);
        return IpLong2Str(ipLong);
    }

    /**
     * 把长整型的IP转化为字符串形式
     * 
     * @param ipLong
     *            IP长整型值
     * @return IP字符串
     * @throws IllegalArgumentException -
     *             ipLong超过32位
     */
    @Deprecated
    public static String IpLong2Str(Long ipLong) {
        // 长整型数值超过32位
        if (0 != (ipLong >> 32)) {
            throw new IllegalArgumentException("IP's Format error. Arg:ipLong="
                    + ipLong);
        }

        return IpInt2Str(ipLong.intValue());
    }

    /**
     * 把整型的IP转化为字符串形式
     * 
     * @param ipInt
     *            IP整型值
     * @return IP字符串
     */
    @Deprecated
    public static String IpInt2Str(int ipInt) {
        if (ipInt == 0) {
            return "";
        }
        int f1 = 0xff & (ipInt >> 24);
        int f2 = 0xff & (ipInt >> 16);
        int f3 = 0xff & (ipInt >> 8);
        int f4 = 0xff & (ipInt >> 0);
        return Integer.toString(f1) + '.' + f2 + '.' + f3 + '.' + f4;
    }

    /**
     * 把IP字符串转化为长整型
     * 
     * @param ipStr
     *            IP字符串
     * @return IP长整型值
     * @throws IllegalArgumentException -
     *             IP字符串不是有效IP,该IP存储在异常类的message中
     */
    @Deprecated
    public static long IpStr2Long(String ipStr) {
        long ip = IpStr2Int(ipStr);
        ip &= (1L << 32) - 1; // 把int转化为long时的负号影响去掉
        return ip;
    }

    /**
     * 把IP字符串转化为整型
     * 
     * @param ipStr
     *            IP字符串
     * @return IP整型值
     * @throws IllegalArgumentException -
     *             IP字符串不是有效IP,该IP存储在异常类的message中
     */
    @Deprecated
    public static int IpStr2Int(String ipStr) {
        String[] ipStrField = ipStr.split("\\.");
        int[] ipLongField = new int[ipStrField.length];

        if (4 != ipStrField.length) {
            throw new IllegalArgumentException("IP's Format error. Arg:ipStr="
                    + ipStr);
        }

        for (int i = 0; i < ipStrField.length; i++) {
            ipLongField[i] = Integer.valueOf(ipStrField[i]);
            if (255 < ipLongField[i]) {
                throw new IllegalArgumentException(
                        "IP's Format error. Arg:ipStr=" + ipStr);
            }
        }

        return (ipLongField[0] << 24) + (ipLongField[1] << 16)
                + (ipLongField[2] << 8) + ipLongField[3];
    }

    private static String getIpRangeString(List<IpRange> range) {
        StringBuffer rangeString = new StringBuffer();
        for (IpRange r : range) {
            rangeString.append(ipNumber2String(r.getStartIp()) + "-"
                    + ipNumber2String(r.getEndIp()) + ",");
        }
        rangeString.deleteCharAt(rangeString.length() - 1);
        return rangeString.toString();
    }

    public static List<IpRange> getIpRange(String[] includeIp,
            String[] excludeIp) {
        if (includeIp.length != excludeIp.length) {
            return new ArrayList<IpRange>();
        }

        StringBuffer rangeString = new StringBuffer();
        for (int i = 0; i < includeIp.length; i++) {
            rangeString
                    .append(getIpRangeString(getIpRange(includeIp[i],
                            excludeIp[i]))
                            + ",");
        }
        rangeString.deleteCharAt(rangeString.length() - 1);
        
        return getIpRange(rangeString.toString(), null);
    }

    /**
     * 把包含IP串和排除IP串合并成一个不重复的IP段
     * 
     * @param includeIp
     *            包含IP串。允许以逗号分隔的多个CIDR形式的子网,减号分隔的IP范围(大的IP可以放在减号的前面)和单个IP
     * @param excludeIp
     *            排除IP串。其他同includeIp
     * @return 按开始IP由小到大排序的IpRange列表。IpRange对象中startIp<=endIp,如果startIp==endIp,表示单个IP
     *         说明
     *         1.把参数中的子网解析为“0-255”,例如把“192.168.3.0/24”解析为“192.168.3.0-192.168.3.255”形式
     *         2.当子网的IP部分为0时,解析为“0.0.0.0-255.255.255.255”,例如“0.0.0.0/24”和“0.0.0.0/32”都符合此情况
     *         3.当单个IP为0.0.0.0时表示“0.0.0.0-255.255.255.255”
     *         4.在下列情况下,返回null:
     *             a.当includeIp为null或空串时 b.excludeIp包含includeIp时
     * @throws IllegalArgumentException -
     *             IP字符串不是有效IP,该IP存储在异常类的message中
     */
    public static List<IpRange> getIpRange(String includeIp, String excludeIp) {
        if (StringUtils.isBlank(includeIp)) {
            return new ArrayList<IpRange>();//
        }
        List<IpRange> includeList = string2SortedIpRange(includeIp);
        List<IpRange> excludeList = string2SortedIpRange(excludeIp);

        if (null == includeList) {
            return new ArrayList<IpRange>();
        }

        // 处理排除串
        if (null != excludeList && excludeList.size() > 0) {
            for (int i = 0; i < excludeList.size(); i++) {
                IpRange exclude = excludeList.get(i);
                for (int j = 0; j < includeList.size(); j++) {
                    IpRange include = includeList.get(j);

                    // 忽略exclude和include没有交集的情况
                    if ((exclude.getEndIp() < include.getStartIp())) {
                        break;
                    } else if ((exclude.getStartIp() > include.getEndIp())) {
                        continue;
                    }

                    if ((exclude.getStartIp() > include.getStartIp())
                            && (exclude.getEndIp() < include.getEndIp())) {
                        // include包含exclude
                        includeList.add(j + 1, new IpRange(
                                exclude.getEndIp() + 1, include.getEndIp()));
                        includeList.get(j).setEndIp(exclude.getStartIp() - 1);
                        j++;
                    } else if ((exclude.getStartIp() <= include.getStartIp())
                            && (exclude.getEndIp() >= include.getEndIp())) {
                        // exclude包含include
                        includeList.remove(j);
                        j--;
                    } else if ((exclude.getStartIp() <= include.getStartIp())) {
                        // exclude与include前半段重合
                        include.setStartIp(exclude.getEndIp() + 1);
                    } else {
                        // exclude与include后半段重合
                        include.setEndIp(exclude.getStartIp() - 1);
                    }
                }
            }
        }

        return (null == includeList) ? new ArrayList<IpRange>() : includeList;
    }

    /**
     * 功能描述:将ipRanges 转化为 10.10.10.10-10.10.10.11,...
     * @param ipRanges
     * @return
     * String
     */
    public static String ipRanges2IpString(List<IpRange> ipRanges){
        String ipString = "";
        if(ipRanges == null || ipRanges.size() < 1) {
      return ipString;
    }
        
        for(IpRange ipRange : ipRanges){
            ipString = ipString + ipNumber2String(ipRange.getStartIp()) + "-" + ipNumber2String(ipRange.getEndIp()) + ",";
        }
        if(ipString.endsWith(",")){
            ipString = ipString.substring(0,ipString.length() - 1);
        }
        
        return ipString;
    }

    /**
     * 功能描述:将ipRanges 转化为2008810193-2008810198,2008810200-2008810207,...
     * @param ipRanges
     * @return
     * String
     */
    public static String ipRanges2LongIpString(List<IpRange> ipRanges){
        String ipString = "";
        if(ipRanges == null || ipRanges.size() < 1) {
      return ipString;
    }
        
        for(IpRange ipRange : ipRanges){
            ipString = ipString + ipRange.getStartIp() + "-" + ipRange.getEndIp() + ",";
        }
        
        if(ipString.endsWith(",")){
            ipString = ipString.substring(0,ipString.length() - 1);
        }
        
        return ipString;
    }

    /**
     * 2000
     */
    public static long maxIpCount = 2000l;
    
    /**
     * 功能描述:将ipRanges 转化为ip 字符串的集合
     * @param ipRanges
     * @return
     * String
     */
    public static List<String> ipRanges2Ips(List<IpRange> ipRanges){
        List<String> ips =  new ArrayList<String>();
        if(ipRanges == null || ipRanges.size() == 0) {
      return ips;
    }
        if(ipSizeOfIpRanges(ipRanges) > maxIpCount)
     {
      return ips;//最多解析2000个ip出来
    }

        for(IpRange ipRange : ipRanges){
            rangeLong2Ip(ipRange.getStartIp(), ipRange.getEndIp(), ips);
        }

        return ips;
    }
    
    public static long ipSizeOfIpRanges(List<IpRange> ipRanges){
        long size = 0l;
        
        if(ipRanges != null){
            for(IpRange ipRange : ipRanges){
                size += ipRange.getRangeSize();
            }
        }
        
        return size;
    }

    public static List<String> rangeLong2Ip(long begIp, long endIp, List<String> ips) {
        ips = ips == null ? new ArrayList<String>() : ips;
        
        int[] f = { 0, 0, 0, 0 };

        for (; begIp <= endIp; begIp++) {
            for (int i = 0; i < f.length; i++) {
                f[i] = (int) (begIp >> (i << 3)) & 0xFF;
            }
            if((f[0] > 0) && (f[0] < 255)){
                ips.add(String.format("%d.%d.%d.%d", f[3], f[2], f[1], f[0]));
            }
        }
        return ips;
    }



    public static List<IpRange> chuChong(List<IpRange> listIpRange){
        if(listIpRange == null || listIpRange.size() < 1) {
      return listIpRange;
    }
        
        if (listIpRange.size() > 0) {
            // 按开始IP由小到大排序
            Collections.sort(listIpRange, new Comparator<IpRange>() {
                @Override
        public int compare(IpRange left, IpRange right) {
                    long result = left.getStartIp() - right.getStartIp();
                    return (result < 0) ? -1 : (result == 0) ? 0 : 1;
                }
            });

            // 合并重合的相邻IP段
            for (int i = 1; i < listIpRange.size(); i++) {
                IpRange range1 = listIpRange.get(i - 1);
                IpRange range2 = listIpRange.get(i);

                if (range2.getStartIp() < range1.getEndIp() + 2) {
                    // 包含两个IP段紧密相邻的情况,例如“192.168.3.0-192.168.3.255”和“192.168.4.0-192.168.4.255”。
                    // 如果不是“...<...+2”,则不能处理此情况; “...<...+2”相当于“...<=...+1”
                    range1.setEndIp(Math.max(range1.getEndIp(), range2
                            .getEndIp()));
                    listIpRange.remove(i);
                    i--;
                }
            }
            
        }
        
        return listIpRange;
    }
    
    /**
     * 把逗号分隔的多个子网、范围和IP字符串,转化为IpRange列表,并且将最后的数据进行合并返回。
     * 
     * @param ipRange
     *            逗号分隔的多个子网、范围和IP字符串
     * @return IpRange列表
     */
    public static List<IpRange> string2SortedIpRange(String ipRange) {
        if (null == ipRange || ipRange.trim().equals("")) {
            return new ArrayList<IpRange>();
        }
        ipRange = ipRange.trim();
        
        List<IpRange> listIpRange = new ArrayList<IpRange>();
        String[] ipRangeArray = StringUtils.split(ipRange, ",");
        for (int i = 0; i < ipRangeArray.length; i++) {
            IpRange range = singIpRange2IpRange(ipRangeArray[i]);
            if (null != range) {
                listIpRange.add(range);
            }
        }

        if (listIpRange.size() > 0) {
            // 按开始IP由小到大排序
            Collections.sort(listIpRange, new Comparator<IpRange>() {
                @Override
        public int compare(IpRange left, IpRange right) {
                    long result = left.getStartIp() - right.getStartIp();
                    return (result < 0) ? -1 : (result == 0) ? 0 : 1;
                }
            });

            // 合并重合的相邻IP段
            for (int i = 1; i < listIpRange.size(); i++) {
                IpRange range1 = listIpRange.get(i - 1);
                IpRange range2 = listIpRange.get(i);

                if (range2.getStartIp() < range1.getEndIp() + 2) {
                    // 包含两个IP段紧密相邻的情况,例如“192.168.3.0-192.168.3.255”和“192.168.4.0-192.168.4.255”。
                    // 如果不是“...<...+2”,则不能处理此情况; “...<...+2”相当于“...<=...+1”
                    range1.setEndIp(Math.max(range1.getEndIp(), range2
                            .getEndIp()));
                    listIpRange.remove(i);
                    i--;
                }
            }
        }

        return (0 == listIpRange.size()) ? null : listIpRange;
    }

    /**
     * 把逗号分隔的多个子网、范围和IP字符串,转化为IpRange列表
     * 
     * @param ips
     * @return
     */
    public static List<IpRange> ips2IpRanges(String ips) {
      if (null == ips || ips.trim().equals("")) {
      return new ArrayList<IpRange>();
    }
      
      ips = ips.trim();
    
    List<IpRange> ipRanges = new ArrayList<IpRange>();
    
    String[] ipsArray = StringUtils.split(ips, ",");
    
    for (int i = 0; i < ipsArray.length; i++) {
      ipRanges.add(singIpRange2IpRange(ipsArray[i]));
    }
    
    return ipRanges;
    }
    
    /**
     * 把单个子网,范围和单个IP转换为IpRange对象
     * 
     * @param ipRange
     *            单个子网、范围或IP字符串。0.0.0.0和0.0.0.0/XX表示0.0.0.0-255.255.255.255
     * @return IpRange对象。保证IpRange中的startIp <= endIp。
     */
    public static IpRange singIpRange2IpRange(String ipRange) {
        long startIp = 0;
        long endIp = 0;

        if (0 <= ipRange.indexOf('/')) {// 形如192.168.29.0/24
            String[] range = ipRange.split("/");
            startIp = IpStr2Long(range[0]);

            if (2 != range.length) {
                throw new IllegalArgumentException(
                        "IP's Format error. Arg:ipRange=" + ipRange);
            }

            int maskLen = Integer.valueOf(range[1]);
            int mask = 0x80000000 >> (maskLen - 1);
            if ((maskLen < 0) || (maskLen > 32)) {
                throw new IllegalArgumentException(
                        "Mask len error. Arg:ipRange=" + ipRange);
            }

            startIp &= mask;
            endIp = startIp | (~mask);
            if (0 == startIp) {// ip为0时,开始IP为0,结束IP为255.255.255.255
                startIp = 0;
                endIp = (1L << 32) - 1;
            }
        } else if (0 <= ipRange.indexOf('-')) {// 形如192.168.29.0-192.168.29.255
            String[] range = ipRange.split("-");
            if (2 != range.length) {
                throw new IllegalArgumentException(
                        "IP's Format error. Arg:ipRange=" + ipRange);
            }
            startIp = IpStr2Long(range[0]);
            endIp = IpStr2Long(range[1]);
        } else {// 单个IP
            startIp = endIp = IpStr2Long(ipRange);
            if (0 == endIp) {
                endIp = (1L << 32) - 1;
            }
        }

        return new IpRange(Math.min(startIp, endIp), Math.max(startIp, endIp));
    }
    
    /**
     * 将字符串IP转换成整数IP
     * 
     * @param ip
     *            待转换的IP字符串
     * @return 返回一个整数,如果格式不正常,则返回一个null指针
     */
    public static Long ipString2Number(String ip) {
      if(StringUtils.isBlank(ip)) {
        return null;
      }
      
        Long ipLong = 0L;
        boolean hasError = false;

        if (isIPV4(ip)) {
            String tmp = ip;
            // get the 3 first numbers
            int offset = 8;
            for (int i = 0; i < 3; i++) {

                // get the position of the first dot
                int index = tmp.indexOf(".");

                // if there is not a dot then the ip string representation is
                // not compliant to the decimal-dotted notation.
                if (index != -1) {

                    // get the number before the dot and convert it into
                    // an integer.
                    String numberStr = tmp.substring(0, index);
                    int number = Integer.parseInt(numberStr);
                    if ((number < 0) || (number > 255)) {
                        hasError = true;
                        break;
                    }

                    ipLong = ipLong << offset;
                    ipLong += number;
                    tmp = tmp.substring(index + 1);
                } else {
                    hasError = true;
                    break;
                }
            }

            // the remaining part of the string should be the last number.
            if (tmp.length() > 0) {
                int number = Integer.parseInt(tmp);
                if ((number < 0) || (number > 255)) {
                    hasError = true;
                }

                ipLong = ipLong << offset;
                ipLong += number;
            }
        }
        if (hasError) {
            return null;
        } else {
            return ipLong;
        }

    }

    /**
     * 将一个整数转换成其相对应的使用‘点分法’表示的IP,如127.0.0.1
     * 
     * @param ip
     *            待转换的整数
     * @return 返回一个String,内容为‘点分法’表示的IP,如127.0.0.1
     */
    public static String ipNumber2String(Long ip) {
        
        if (ip.equals(0L)) {
            return "";
        }
        StringBuffer result = new StringBuffer();
        Long temp;

        temp = ip & 0xFF000000;
        temp = temp >> 24;
        result.append(temp);
        result.append(".");

        temp = ip & 0x00FF0000;
        temp = temp >> 16;
        result.append(temp);
        result.append(".");

        temp = ip & 0x0000FF00;
        temp = temp >> 8;
        result.append(temp);
        result.append(".");

        temp = ip & 0x000000FF;
        result.append(temp);

        return result.toString();
    }

    /**
     * IP格式验证
     */
    public static boolean isIPV4(String s) {
        try {
            String number = s.substring(0, s.indexOf('.'));
            if (Integer.parseInt(number) > 255) {
        return false;
      }
            s = s.substring(s.indexOf('.') + 1);
            number = s.substring(0, s.indexOf('.'));
            if (Integer.parseInt(number) > 255) {
        return false;
      }
            s = s.substring(s.indexOf('.') + 1);
            number = s.substring(0, s.indexOf('.'));
            if (Integer.parseInt(number) > 255) {
        return false;
      }
            number = s.substring(s.indexOf('.') + 1);
            return Integer.parseInt(number) <= 255;
        } catch (Exception e) {
            return false;
        }

    }

    /**
     * 判断ip是否在ipRange集合中
     * @param ip
     * @param ipRangeList
     * @return    (参数说明)
     * @return boolean    返回类型
     * @throws
     */
    public static boolean isIpInIpRange(long ip, List<IpRange> ipRangeList) {
        boolean result = false;
        if(ipRangeList != null) {
            for(IpRange ir : ipRangeList) {
                if(ip >= ir.getStartIp() && ip <= ir.getEndIp()) {
                    result = true;
                    break;
                }
            }
        }
        
        return result;
    }

    /**
     * 判断ip是否在ipRange集合中
     * @param
     * @param ipRangeList
     * @return    (参数说明)
     * @return boolean    返回类型
     * @throws
     */
    public static boolean isIpStrInIpRange(String ipStr, List<IpRange> ipRangeList) {
        long ip = 0;
        try {
            ip = IpStr2Long(ipStr);
        } catch (Exception e) {
            return false;
        }
        
        return isIpInIpRange(ip, ipRangeList);
    }
    
    /**
     * (将包含IP串和排除IP串转成List<String ip>)
     * @param ip 包含IP串 例:192.168.1.119,192.168.2.119,192.168.2.200-192.168.2.220,192.168.3.1/31
     * @param excludeIp 排除IP串 例:192.168.2.201,192.168.1.1/31
     * @return    (返回String类型的List,其中每个String为一个ip)
     * @return List<String>    返回类型
     * @throws
     */
    public static List<String> ip2StringList(String ip,String excludeIp){
        List<IpRange> list1 = getIpRange(ip, excludeIp);
        List<String> list2 = ipRanges2Ips(list1);
        return list2;
    }
    
    /**
     * 检查单个IP是否为内网IP<br>
     * 内网IP范围:
     * <li>10.0.0.0--10.255.255.255</li>
     * <li>172.16.0.0--172.31.255.255</li>
     * <li>192.168.0.0--192.168.255.255</li>
     * @param
     * @return
     */
    public static boolean isLANIP(String ipStr) {
      long ip = 0;
    try {
      ip = IpStr2Long(ipStr);
    } catch (Exception e) {
      return false;
    }
    return isLANIP(ip);
    }
    
  /**
   * 检查单个IP是否为内网IP<br>
   * 内网IP范围:
   * <li>10.0.0.0--10.255.255.255</li>
   * <li>172.16.0.0--172.31.255.255</li>
   * <li>192.168.0.0--192.168.255.255</li>
   * @param ip
   * @return
   */
  public static boolean isLANIP(long ip) {
    /*
    List<IpRange> ipRangeList = new ArrayList<IpRange>();
    
    IpRange r_10 = new IpRange(IpTools.IpStr2Long("10.0.0.0"), IpTools.IpStr2Long("10.255.255.255"));
    IpRange r_172 = new IpRange(IpTools.IpStr2Long("172.16.0.0"), IpTools.IpStr2Long("172.31.255.255"));
    IpRange r_192 = new IpRange(IpTools.IpStr2Long("192.168.0.0"), IpTools.IpStr2Long("192.168.255.255"));
        
    ipRangeList.add(r_10);
    ipRangeList.add(r_172);
    ipRangeList.add(r_192);
    */
    List<IpRange> ipRangeList = ips2IpRanges(getLANIP());
    
    return isIpInIpRange(ip, ipRangeList);
  }

  /**
   * 指定的 ip 是否为 指定的 ip范围 ipRange 中的 ip C 网段内
   * @param ip 单个 ip
   * @param ipRange 包含IP串 例:192.168.1.119,192.168.2.119,192.168.2.200-192.168.2.220,192.168.3.1/31
   * @return
   */
  public static boolean isCLANIP(long ip, String ipRange) {
    List<IpRange> ipRangeList = ips2IpRanges(ipRange);
    
    String ipStr = IpTools.IpLong2Str(ip);
    String[] ipStrArray = ipStr.split("[.]");
    
    for(IpRange r : ipRangeList) {
      String[] startIpArray = IpTools.IpLong2Str(r.getStartIp()).split("[.]");
      String[] endIpArray = IpTools.IpLong2Str(r.getEndIp()).split("[.]");
      
      if(Integer.valueOf(ipStrArray[0]).intValue() == Integer.valueOf(startIpArray[0]).intValue()
          && Integer.valueOf(ipStrArray[0]).intValue() == Integer.valueOf(endIpArray[0]).intValue()
          && Integer.valueOf(ipStrArray[1]).intValue() == Integer.valueOf(startIpArray[1]).intValue()
          && Integer.valueOf(ipStrArray[1]).intValue() == Integer.valueOf(endIpArray[1]).intValue()
          && Integer.valueOf(ipStrArray[2]).intValue() == Integer.valueOf(startIpArray[2]).intValue()
          && Integer.valueOf(ipStrArray[2]).intValue() == Integer.valueOf(endIpArray[2]).intValue()
          && Integer.valueOf(ipStrArray[3]).intValue() >= Integer.valueOf(startIpArray[3]).intValue()
          && Integer.valueOf(ipStrArray[3]).intValue() <= Integer.valueOf(endIpArray[3]).intValue()) {
        return true;
      }
    }
    
    return false;
  }
  
  /**
   * 获得默认内网 IP 地址。
   * @return 10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255
   */
  public static String getLANIP() {
    return "10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255";
  }
  
  /**
   * 返回提供的 IP 是否为保留地址<br>
   * 目前保留地址范围为:
   * <li>0.0.0.0</li>
   * <li>255.255.255.255</li>
   * <li>224.0.0.0-239.255.255.255</li>
   * <li>xxx.xxx.xxx.0</li>
   * <li>xxx.xxx.xxx.255</li>
   * <li>0.xxx.xxx.xxx</li>
   * <li>255.xxx.xxx.xxx</li><br>
   * @return
   */
  public static boolean isReservedIP(String ip) {
    if("0".equals(ip) || "0.0.0.0".equals(ip) || "255.255.255.255".equals(ip)) {
      return true;
    }
    if(isStartReservedIP(ip) || isEndReservedIP(ip)) {
      return true;
    }
    return isReservedIP(IpStr2Long(ip));
  }
  
  /**
   * 返回提供的 IP 是否为保留地址<br>
   * 目前保留地址范围为:
   * <li>0.0.0.0</li>
   * <li>255.255.255.255</li>
   * <li>224.0.0.0-239.255.255.255</li>
   * <li>xxx.xxx.xxx.0</li>
   * <li>xxx.xxx.xxx.255</li>
   * <li>0.xxx.xxx.xxx</li>
   * <li>255.xxx.xxx.xxx</li><br>
   * @return
   */
  public static boolean isReservedIP(long ip) {
    if(ip == 0) {
      return true;
    }
    
    String ipStr = IpLong2Str(ip);
    if(isStartReservedIP(ipStr) || isEndReservedIP(ipStr)) {
      return true;
    }
    
    List<IpRange> ipRangeList = ips2IpRanges(getReservedIp());
    return isIpInIpRange(ip, ipRangeList);
  }
  
  private static boolean isStartReservedIP(String ip) {
    return ip.startsWith("0.") || ip.startsWith("255.");//0.xxx.xxx.xxx, 255.xxx.xxx.xxx
  }
  
  private static boolean isEndReservedIP(String ip) {
    return ip.endsWith(".0") || ip.endsWith(".255");//xxx.xxx.xxx.0, xxx.xxx.xxx.255
  }

  /**
   * 返回部分保留地址
   * @return
   */
  private static String getReservedIp() {
    return "255.255.255.255,224.0.0.0-239.255.255.255";//0.0.0.0?
  }
  
  /**
   * 根据提供的数据库表中 IP 列名称(columns)构造针对整型 IP 过滤掉保留地址的 WHERE 表达式。<br>
   * 目前保留地址范围为:
   * <li>0.0.0.0</li>
   * <li>255.255.255.255</li>
   * <li>224.0.0.0-239.255.255.255</li>
   * <li>xxx.xxx.xxx.0</li>
   * <li>xxx.xxx.xxx.255</li>
   * <li>0.xxx.xxx.xxx</li>
   * <li>255.xxx.xxx.xxx</li><br>
   * 若数据库表列名称为“ip”,则构造后的 WHERE 表达式为:<br>
   * <pre><b> (ip <> 0 AND ip <> 4294967295 AND (ip < 3758096384 OR ip > 4026531839)) </b></pre>
   * <b style="color:red;">注:该方法目前返回的表达中不包括如下范围 IP 的过滤:<br>xxx.xxx.xxx.0、xxx.xxx.xxx.255、0.xxx.xxx.xxx、255.xxx.xxx.xxx</b>
   * 
   * @param column 要查询的数据库表中 IP 列的名称
   * @return 构造后的针对整型 IP 过滤掉保留地址的 WHERE 表达式
   */
  public static String getExcludeReservedIpWhereExpression4LongIp(String column) {
    return " (" +
           column + " <> 0 AND " + column + " <> 4294967295 AND (" +//0.0.0.0, 255.255.255.255
           column + " < 3758096384 OR " + column + " > 4026531839)) ";//224.0.0.0-239.255.255.255
           //xxx.xxx.xxx.0, xxx.xxx.xxx.255???
           //0.xxx.xxx.xxx, 255.xxx.xxx.xxx??
  }
  /**
   * 根据提供的数据库表中 IP 列名称(columns)构造针对字符串 IP(符合 IPV4 格式的 IP 地址) 过滤掉保留地址的 WHERE 表达式。<br>
   * 目前保留地址范围为:
   * <li>0.0.0.0</li>
   * <li>255.255.255.255</li>
   * <li>224.0.0.0-239.255.255.255</li>
   * <li>xxx.xxx.xxx.0</li>
   * <li>xxx.xxx.xxx.255</li>
   * <li>0.xxx.xxx.xxx</li>
   * <li>255.xxx.xxx.xxx</li><br>
   * 若数据库表列名称为“ip”,则构造后的 WHERE 表达式为:<br>
   * <pre><b> (ip NOT LIKE '224.%' AND ip NOT LIKE '239.%' AND ip NOT LIKE '%.0' AND ip NOT LIKE '%.255') </b></pre>
   * <b style="color:red;">注:该方法目前返回的表达中不包括如下范围 IP 的过滤:<br>0.xxx.xxx.xxx、255.xxx.xxx.xxx</b>
   * 
   * @param column 要查询的数据库表中 IP 列的名称
   * @return 构造后的针对整型 IP 过滤掉保留地址的 WHERE 表达式
   */
  public static String getExcludeReservedIpWhereExpression4StringIp(String column) {
    return " " +
           //column + " <> 0.0.0.0 AND " + column + " <> 255.255.255.255 AND " +//0.0.0.0, 255.255.255.255 已经在 .0 和 .255 中包含了
           column + " NOT LIKE '224.%' AND " + column + " NOT LIKE '239.%' AND " +//224.0.0.0-239.255.255.255
           //column + " NOT LIKE '0.%' AND " + column + " NOT LIKE '255.%' AND " +//0.xxx.xxx.xxx, 255.xxx.xxx.xxx
               column + " NOT LIKE '%.0' AND " + column + " NOT LIKE '%.255' ";//xxx.xxx.xxx.0, xxx.xxx.xxx.255
  }
  
  /**
   * 构造 SQL 查询中针对 IP 范围过滤的 WHERE 查询条件。<br>
   * 返回数据格式如下:<br>
   *  <pre><b>((src_ip >= 167772160 AND src_ip <= 184549375) OR (src_ip >= 2886729728 AND src_ip <= 2887778303) OR (src_ip >= 3232235520 AND src_ip <= 3232301055))</b></pre>
   * 
   * @param ips 以逗号 “,” 分隔的多个 IP、IP 范围、子网。
   *  若该参数为 null 或 为空值,则返回默认内网 IP(IpTools.getLANIP()) 构造的 WHERE 条件表达式。
   * @param column
   * @return 包含指定IP范围的条件表达式。排除了保留地址,参见:{@link #getExcludeReservedIpWhereExpression4LongIp(String)}
   */
  public static String getWhereIncludeExpression4Ips(String ips, String column) {
    if(StringUtils.isBlank(column)) {
      return "";
    }
    
    String wlanIp = ips;
    
    if(StringUtils.isBlank(ips)) {
      wlanIp = getLANIP();
    }
    
    return getWhereIncludeExpression4IpRange(ips2IpRanges(wlanIp), column);
  }
  
  /**
   * 构造 SQL 查询中针对 IP 范围过滤的 WHERE 查询条件。<br>
   * 返回数据格式如下:<br>
   *  <pre><b>((src_ip >= 167772160 AND src_ip <= 184549375) OR (src_ip >= 2886729728 AND src_ip <= 2887778303) OR (src_ip >= 3232235520 AND src_ip <= 3232301055))</b></pre>
   * 
   * @param wlanIpRange 若该参数为 null 或 size 为 0,则返回默认内网 IP(IpTools.getLANIP()) 构造的 WHERE 条件表达式。
   * @param column
   * @return 包含指定IP范围的条件表达式。排除了保留地址,参见:{@link #getExcludeReservedIpWhereExpression4LongIp(String)}
   */
  public static String getWhereIncludeExpression4IpRange(List<IpRange> wlanIpRange, String column) {
    if(StringUtils.isBlank(column)) {
      return "";
    }
    
    List<IpRange> ipRange = wlanIpRange;
    
    if(wlanIpRange == null || wlanIpRange.size() == 0) {
      ipRange = ips2IpRanges(getLANIP());
    }
    
    long startIp = 0;
    long endIp = 0;
    
    String where = "";
    
    for(IpRange r : ipRange) {
      startIp = r.getStartIp();
      endIp = r.getEndIp();
      
      if(StringUtils.isNotBlank(where)) {
        where += " OR ";
      }
      
      if(startIp == endIp) {
        where += "(" + column + " = " + startIp + ")";
      } else {
        where += "(" + column + " >= " + startIp + " AND " + column + " <= " + endIp + ")";
      }
    }
    
    where = " (" + where + ") ";
    where += " AND " + getExcludeReservedIpWhereExpression4LongIp(column);//添加上针对保留地址的过滤
        
    return where;
  }
  
  /**
   * 构造 SQL 查询中针对 IP 范围过滤的 WHERE 查询条件。<br>
   * 返回数据格式如下:<br>
   *  <pre><b>((src_ip >= 167772160 AND src_ip <= 184549375) OR (src_ip >= 2886729728 AND src_ip <= 2887778303) OR (src_ip >= 3232235520 AND src_ip <= 3232301055))</b></pre>
   * 
   * @param ips 以逗号 “,” 分隔的多个 IP、IP 范围、子网。
   *  若该参数为 null 或 为空值,则返回默认内网 IP(IpTools.getLANIP()) 构造的 WHERE 条件表达式。
   * @param column
   * @return 排除指定IP范围的条件表达式
   */
  public static String getWhereExcludeExpression4Ips(String ips, String column) {
    if(StringUtils.isBlank(column)) {
      return "";
    }
    
    String wlanIp = ips;
    
    if(StringUtils.isBlank(ips)) {
      wlanIp = getLANIP();
    }
    
    return getWhereExcludeExpression4IpRange(ips2IpRanges(wlanIp), column);
  }
  
  /**
   * 构造 SQL 查询中针对 IP 范围过滤的 WHERE 查询条件。<br>
   * 返回数据格式如下:<br>
   *  <pre><b>((src_ip >= 167772160 AND src_ip <= 184549375) OR (src_ip >= 2886729728 AND src_ip <= 2887778303) OR (src_ip >= 3232235520 AND src_ip <= 3232301055))</b></pre>
   * 
   * @param wlanIpRange 若该参数为 null 或 size 为 0,则返回默认内网 IP(IpTools.getLANIP()) 构造的 WHERE 条件表达式。
   * @param column
   * @return 排除指定IP范围的条件表达式
   */
  public static String getWhereExcludeExpression4IpRange(List<IpRange> wlanIpRange, String column) {
    if(StringUtils.isBlank(column)) {
      return "";
    }
    
    List<IpRange> ipRange = wlanIpRange;
    
    if(wlanIpRange == null || wlanIpRange.size() == 0) {
      ipRange = ips2IpRanges(getLANIP());
    }
    
    long startIp = 0;
    long endIp = 0;
    
    String where = "";
    
    for(IpRange r : ipRange) {
      startIp = r.getStartIp();
      endIp = r.getEndIp();
      
      if(StringUtils.isNotBlank(where)) {
        where += " AND ";
      }
      
      if(startIp == endIp) {
        where += "(" + column + " <> " + startIp + ")";
      } else {
        where += "(" + column + " <= " + startIp + " OR " + column + " >= " + endIp + ")";
      }
    }
    
    where = " (" + where + ") ";
    where += " AND " + getExcludeReservedIpWhereExpression4LongIp(column);//添加上针对保留地址的过滤
    
    return where;
  }
  /**
   * 判断是否是本地局域网IP
   * @param ip
   * @return
   */
  public static boolean isLocalNetArea(String ip){
    if(!isIPV4(ip)){
      throw new IllegalArgumentException("不是IP地址!");
    }else{
      Long ipNum=ipString2Number(ip);
      Long aStart=ipString2Number("10.0.0.0");
      Long aEnd=ipString2Number("10.255.255.255");
      Long bStart=ipString2Number("172.16.0.0");
      Long bEnd=ipString2Number("172.31.255.255");
      Long cStart=ipString2Number("192.168.0.0");
      Long cEnd=ipString2Number("192.168.255.255");
        return (ipNum >= aStart && ipNum <= aEnd) || (ipNum >= bStart && ipNum <= bEnd) || (ipNum >= cStart && ipNum <= cEnd);
    }
  }
  
  /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = rangeLong2Ip(3232235777L, 3232236079L, null);
        System.out.println(list);
        System.out.println(Long.valueOf("3232238404").intValue() + IpLong2Str("3232238404"));
        System.out.println(Long.valueOf("3232238418").intValue() + IpLong2Str("3232238418"));
        
        System.out.println("0.0.0.0=" + IpStr2Long("0.0.0.0"));
        System.out.println("255.255.255.255=" + IpStr2Long("255.255.255.255"));
        
        System.out.println("192.168.1.117=" + IpStr2Long("192.168.1.117"));
        System.out.println("172.16.10.15=" + IpStr2Long("172.16.10.15"));
        
        System.out.println("59.59.59.59=" + IpStr2Long("59.59.59.59"));
        System.out.println("3232235856=" + IpLong2Str("3232235856"));
        
        System.out.println("1.2.3.4=" + IpStr2Long("1.2.3.4"));
        
        System.out.println(isLANIP("192.168.254.90"));
        System.out.println(isLANIP("172.16.3.1"));
        
        System.out.println(IpLong2Str(IpStr2Long("192.168.10.1") + 255));

        System.out.println(ips2IpRanges("255.255.255.255"));
        System.out.println((738177535 + 255));
        
        System.out.println(getExcludeReservedIpWhereExpression4LongIp("ip"));
        System.out.println(getExcludeReservedIpWhereExpression4StringIp("ip"));
        
        System.out.println(ips2IpRanges(getLANIP()));
        
        Long l1 = 123l;
        Long l2 = 123l;
        System.out.println(l1 + "," + l2);
                
        System.out.println(getWhereIncludeExpression4Ips("192.168.0.0-192.168.0.200,192.168.1.200,172.16.1.2-172.16.1.20", "src_ip"));
        System.out.println(getWhereIncludeExpression4Ips(null, "src_ip"));
        System.out.println(getWhereIncludeExpression4IpRange(null, "src_ip"));
        
        System.out.println(getWhereExcludeExpression4Ips("192.168.0.0-192.168.0.200,192.168.1.200,172.16.1.2-172.16.1.20", "src_ip"));
    System.out.println(getWhereExcludeExpression4Ips(null, "src_ip"));
    System.out.println(getWhereExcludeExpression4IpRange(null, "src_ip"));
    }

    /**
     * 数字类型的子网掩码转换成IP格式。例如:255.255.0.0 转成16
     * @param netmask
     * @return
     */
    public static String formateNetmask(int netmask) {
      if(netmask<0||netmask>25) {
        throw new RuntimeException("错误的子网掩码:"+netmask);
      }
      long x=(long) (Math.pow(2, 32)-Math.pow(2, 32-netmask));
      return ipNumber2String(x);
    }
    /**
     * IP格式的子网掩码转换成数字格式。 例如:8转换成255.0.0.0
     * @param netmask
     * @return
     */
    public static int parseNetmask(String netmask) {
      long x=ipString2Number(netmask);
      String bStr=Long.toBinaryString(x);
      int firstZeroIdx=bStr.indexOf("0");
      int lastIdx=bStr.lastIndexOf("1");
      if(firstZeroIdx-1!=lastIdx||bStr.length()!=32) {
        throw new RuntimeException("错误的子网掩码:"+netmask);
      }
      return lastIdx+1;
    }
    /**
     * 判断ipv6是否合法
     *
     * @param ip
     * @return
     */
    public static boolean isValidIPv6(String ip) {
        if (ip == null || ip.trim().length() == 0) {
            return false;
        }
        String t = "^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$";
        Pattern p = Pattern.compile(t);
        Matcher macher = p.matcher(ip);
        return macher.matches();
    }


    /**
     * 返回a和b的关系
     * @param a
     * @param b
     * @return 1:a包含b 2:b包含a 3:相交 4:互斥 5:相等
     */
    public static int calRelation(List<IpRange> a,List<IpRange> b){
        List<List<Long>> aRangeList=new ArrayList<List<Long>>();
        List<List<Long>> bRangeList=new ArrayList<List<Long>>();
        List<Long> points=new ArrayList<Long>();
        for(IpRange r:a){
            if (points.indexOf(r.getStartIp())==-1){
                points.add(r.getStartIp());
            }
            if (points.indexOf(r.getEndIp())==-1){
                points.add(r.getEndIp());
            }
            aRangeList.add(Arrays.asList(r.getStartIp(),r.getEndIp()));
        }
        for(IpRange r:b){
            if (points.indexOf(r.getStartIp())==-1){
                points.add(r.getStartIp());
            }
            if (points.indexOf(r.getEndIp())==-1){
                points.add(r.getEndIp());
            }
            bRangeList.add(Arrays.asList(r.getStartIp(),r.getEndIp()));
        }
        Collections.sort(points, new Comparator<Long>() {
            @Override
            public int compare(Long o1, Long o2) {
                return new Long(o1-o2).intValue();
            }
        });
        for(Long point:points){
            for(int i=0;i<aRangeList.size();i++){
                List<Long> range =aRangeList.get(i);
                if(range.get(0)<point&&range.get(1)>point){
                    aRangeList.remove(i);
                    aRangeList.add(Arrays.asList(range.get(0),point));
                    aRangeList.add(Arrays.asList(point,range.get(1)));
                }
            }
            for(int i=0;i<bRangeList.size();i++){
                List<Long> range =bRangeList.get(i);
                if(range.get(0)<point&&range.get(1)>point){
                    bRangeList.remove(i);
                    bRangeList.add(Arrays.asList(range.get(0),point));
                    bRangeList.add(Arrays.asList(point,range.get(1)));
                }
            }
        }
        boolean removed=false;
        Iterator<List<Long>> ait=aRangeList.iterator();
        while(ait.hasNext()){
            List<Long> rangea =ait.next();
            Iterator<List<Long>> bit=bRangeList.iterator();
            while(bit.hasNext()){
                List<Long> rangeb =bit.next();
                if(rangea.get(0).equals(rangeb.get(0))&&rangea.get(1).equals(rangeb.get(1))){
                    removed=true;
                    ait.remove();
                    bit.remove();
                }
            }
        }

        if(!aRangeList.isEmpty()&&bRangeList.isEmpty()){
            return 1;
        }else if(aRangeList.isEmpty()&&!bRangeList.isEmpty()){
            return 2;
        }else if(!aRangeList.isEmpty()&&!bRangeList.isEmpty()){
            if(removed){
                return 3;
            }else{
                return 4;
            }
        }else{
            return 5;
        }
    }

    /**
     * 批量转换IP地址工具类 返回map
     * @param ipLong
     * @return key为传入long类型 value为ip字符串
     * @Author haoqingshuang
     */
    public static Map<Long,String> batchNumConvertIp(List<Long> ipLong) {
        Map<Long, String> result = new HashMap<>();
        if (ipLong.isEmpty()) {
            return result;
        }
        StringBuffer ipInfo = new StringBuffer();
        for (Long aLong : ipLong) {
            if (StringUtils.isNotBlank(result.get(aLong))) {
                continue;
            }
            ipInfo = new StringBuffer();
            // 直接右移24位
            ipInfo.append((aLong >>> 24));
            ipInfo.append(".");
            // 将高8位置0,然后右移16位
            ipInfo.append(((aLong & 0x00FFFFFF) >>> 16));
            ipInfo.append(".");
            // 将高16位置0,然后右移8位
            ipInfo.append(((aLong & 0x0000FFFF) >>> 8));
            ipInfo.append(".");
            // 将高24位置0
            ipInfo.append((aLong & 0x000000FF));
            result.put(aLong, ipInfo.toString());
        }
        return result;
    }
}
View Code

6.WordUtils

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * 导出word工具类
 */
public class UasWordUtils {

    private static final Logger logger = LoggerFactory.getLogger(UasWordUtils.class);

    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {
        Configuration cfg = new Configuration();
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        cfg.setNumberFormat("#");
        cfg.setClassForTemplateLoading(UasWordUtils.class, "template");
        Template freemarkerTemplate = cfg.getTemplate(ftlFile, "utf-8");
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 调用工具类的createDoc方法生成Word文档
            file = createDoc(map, freemarkerTemplate);
            fin = new FileInputStream(file);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 设置浏览器以下载的方式处理该文件名
            String fileName = title + DateUtil.ymdhmsFormat(new Date()) + ".doc";
            response.setHeader("Content-Disposition", "attachment;filename="
                    .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

            out = response.getOutputStream();
            byte[] buffer = new byte[512];  // 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } catch (Exception e) {
            logger.error("导出word异常:",e);
        } finally {
            if (fin != null) fin.close();
            if (out != null) out.close();
            if (file != null) file.delete(); // 删除临时文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template) {
        String name = "sellPlan.doc";
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8);
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            logger.error("导出word填充数据异常:",ex);
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}
View Code

 7.离线IP区划定位

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * ip-地域处理器
* @Title: IPDataHandler.java
* @Description: 基于ipip.net的17monipdb.dat
 */
public class IPDataHandler {
    private DataInputStream inputStream = null;
    private long fileLength = -1;
    private int dataLength = -1;
    private Map<String, String> cacheMap = null;
    private byte[] allData = null;
    
    @SuppressWarnings("deprecation")
    public IPDataHandler(){
        File file = new File(URLDecoder.decode(this.getClass().getResource("").getPath()+"/17monipdb.dat")); 
        try {
        inputStream = new DataInputStream(new FileInputStream(file));
        fileLength = file.length();
        cacheMap = new HashMap<String, String>();
        if (fileLength >Integer.MAX_VALUE) {
        throw new Exception("the filelength over 2GB");
        }
        dataLength = (int) fileLength;
        allData = new byte[dataLength];
        inputStream.read(allData, 0, dataLength);
        dataLength = (int)getbytesTolong(allData, 0, 4,ByteOrder.BIG_ENDIAN);
        } catch (FileNotFoundException e) {
        e.printStackTrace();
        }catch (IOException e) {
        e.printStackTrace();
        }catch(URISyntaxException e){
            e.printStackTrace();
        }catch (Exception e) {
        e.printStackTrace();
        }
    }
    private long getbytesTolong(byte[] bytes, int offerSet,int size,ByteOrder byteOrder){
        if ((offerSet+size) > bytes.length || size <= 0) {
        return -1;
        }
        byte[] b = new byte[size];
        for (int i = 0; i < b.length; i++) {
        b[i] = bytes[offerSet+i];
        }
        ByteBuffer byteBuffer = ByteBuffer.wrap(b);
        byteBuffer.order(byteOrder);
        long temp = -1;
        if (byteBuffer.hasRemaining()) {
        temp = byteBuffer.getInt();
        }
        return temp;
    }
    
    private long ip2long(String ip) throws UnknownHostException {
        InetAddress address = InetAddress.getByName(ip);
        byte[] bytes = address.getAddress();
        long reslut = getbytesTolong(bytes, 0, 4,ByteOrder.BIG_ENDIAN);
        return reslut;
    }
    private int getIntByBytes(byte[] b,int offSet){
        if (b == null || (b.length < (offSet+3))) {
        return -1;
        }
        byte[] bytes = Arrays.copyOfRange(allData, offSet, offSet+3);
        byte[] bs = new byte[4];
        bs[3] = 0;
        for (int i = 0; i < 3;i++) {
        bs[i]=bytes[i];
        }
        return (int)getbytesTolong(bs, 0, 4, ByteOrder.LITTLE_ENDIAN);
    }
    
    public String findGeography(String address){
        if (address == null) {
        return "illegal address";
        }
        if (dataLength < 4 || allData == null) {
        return "illegal ip data";
        }
        String ip = "127.0.0.1";
        try {
        ip = Inet4Address.getByName(address).getHostAddress();
        } catch (UnknownHostException e) {
        e.printStackTrace();
        }
        // String[] ipArray = StringUtils.split(ip, ".");
        // String[] ipArray = ip.split(".");
        //String[] ipArray = {"8", "8", "8", "8"};
        String[] ipArray = ip.split("\\.");
        int ipHeadValue = Integer.parseInt(ipArray[0]);
        if (ipArray.length !=4 || ipHeadValue < 0 || ipHeadValue > 255) {
        return "illegal ip";
        }
        if (cacheMap.containsKey(ip)) {
        return cacheMap.get(ip);
        }
        long numIp = 1;
        try {
        numIp = ip2long(address);
        } catch (UnknownHostException e1) {
        e1.printStackTrace();
        }
        int tempOffSet = ipHeadValue* 4 + 4;
        long start = getbytesTolong(allData, tempOffSet, 4,ByteOrder.LITTLE_ENDIAN);
        int max_len = dataLength - 1028;
        long resultOffSet = 0;
        int resultSize = 0;
        for (start = start*8 + 1024; start < max_len; start+=8) {
        if (getbytesTolong(allData, (int)start+4, 4,ByteOrder.BIG_ENDIAN) >= numIp) {
        resultOffSet = getIntByBytes(allData, (int)(start+4+4));
        resultSize = (char)allData[(int)start+7+4];
        break;
        }
        }
        if (resultOffSet <= 0) {
        return "resultOffSet too small";
        }
        byte[] add = Arrays.copyOfRange(allData, (int)(dataLength+resultOffSet-1024), (int)(dataLength+resultOffSet-1024 + resultSize));
        try {
        if (add == null) {
        cacheMap.put(ip, new String("no data found!!"));
        } else {
        cacheMap.put(ip, new String(add,"UTF-8"));
        }
        } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        }
        return cacheMap.get(ip);
    }
    
    public static void main(String[] args) {
        IPDataHandler obj = new IPDataHandler();
        System.out.println(obj.findGeography("53.248.9.181"));
        System.out.println(obj.findGeography("223.71.69.202"));
    }
}
    
View Code
链接:https://pan.baidu.com/s/1Ok-5WQ8jEk-JgXSG7j42bw?pwd=1tg5 
提取码:1tg5
离线IP库

 

posted @ 2022-06-09 14:26  不再_单纯  阅读(80)  评论(0)    收藏  举报