重要的事情说一遍,注意本代码实现的优点是批量查询!!!
当前单个手机号码查询也是没有问题的。
由于公司行业主要是展会行业,展会上的观众注册等,填写基本信息的时候会采集手机号等信息,展会结束后我们需要做数据分析。只有通过手机号查找归属地来获取客户的地域信息。找了好多平台和api,发现没有说是能批量处理手机号信息。最后还是找了githup上找到一个插件,感谢那位大神的贡献。

传送门> https://github.com/xluohome/phonedata
主要涉及到两个类和一个dat文件
PhoneNumberGeo.java 和 PhoneNumberInfo.java 以及一个 phone.dat文件(存放手机归属信息的),dat文件可在传送门里面找到。
PhoneNumberGeo.java 文件内容如下,主要作用是来读取phone.dat文件。

package com.yh.util.phone;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;/*** Created by buring 18/10/12.*/
public class PhoneNumberGeo {private static String[] numberType = {null, "移动", "联通", "电信", "电信虚拟运营商", "联通虚拟运营商", "移动虚拟运营商"};private static final int INDEX_SEGMENT_LENGTH = 9;private static byte[] dataByteArray;private ByteBuffer byteBuffer;private int indexAreaOffset = -1;private int phoneRecordCount = -1;public PhoneNumberGeo() {if (dataByteArray == null) {synchronized (PhoneNumberGeo.class) {if (dataByteArray == null) {ByteArrayOutputStream byteData = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int readBytesLength;try {InputStream inputStream = PhoneNumberGeo.class.getResourceAsStream("phone.dat");while ((readBytesLength = inputStream.read(buffer)) != -1) {byteData.write(buffer, 0, readBytesLength);}inputStream.close();} catch (Exception e) {System.err.println("Can't find phone.dat in classpath:phone-number-geo/phone.dat");e.printStackTrace();throw new RuntimeException(e);}dataByteArray = byteData.toByteArray();}}}byteBuffer = ByteBuffer.wrap(dataByteArray);byteBuffer.order(ByteOrder.LITTLE_ENDIAN);int dataVersion = byteBuffer.getInt();indexAreaOffset = byteBuffer.getInt();// print data version// System.out.println(dataVersion);phoneRecordCount = (dataByteArray.length - indexAreaOffset) / INDEX_SEGMENT_LENGTH;// print record count// System.out.println(phoneRecordCount);}public PhoneNumberInfo lookup(String phoneNumber) {if (phoneNumber == null || phoneNumber.length() > 11 || phoneNumber.length() < 7) {return null;}int phoneNumberPrefix;try {phoneNumberPrefix = Integer.parseInt(phoneNumber.substring(0, 7));} catch (Exception e) {return null;}int left = 0;int right = phoneRecordCount;while (left <= right) {int middle = (left + right) >> 1;int currentOffset = indexAreaOffset + middle * INDEX_SEGMENT_LENGTH;if (currentOffset >= dataByteArray.length) {return null;}byteBuffer.position(currentOffset);int currentPrefix = byteBuffer.getInt();if (currentPrefix > phoneNumberPrefix) {right = middle - 1;} else if (currentPrefix < phoneNumberPrefix) {left = middle + 1;} else {int infoBeginOffset = byteBuffer.getInt();int phoneType = byteBuffer.get();int infoLength = -1;for (int i = infoBeginOffset; i < indexAreaOffset; ++i) {if (dataByteArray[i] == 0) {infoLength = i - infoBeginOffset;break;}}String infoString =new String(dataByteArray, infoBeginOffset, infoLength, StandardCharsets.UTF_8);String[] infoSegments = infoString.split("\\|");PhoneNumberInfo phoneNumberInfo = new PhoneNumberInfo();phoneNumberInfo.setPhoneNumber(phoneNumber);phoneNumberInfo.setProvince(infoSegments[0]);phoneNumberInfo.setCity(infoSegments[1]);phoneNumberInfo.setZipCode(infoSegments[2]);phoneNumberInfo.setAreaCode(infoSegments[3]);phoneNumberInfo.setPhoneType(numberType[phoneType]);return phoneNumberInfo;}}return null;}public static void main(String[] args) {PhoneNumberGeo phoneNumberGeo = new PhoneNumberGeo();Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {System.out.println(phoneNumberGeo.lookup(scanner.next()));}}
}

PhoneNumberInfo.java 文件内容如下,主要作用 定义一个model

package com.yh.util.phone;public class PhoneNumberInfo {private String phoneNumber;private String province;private String city;private String zipCode;private String areaCode;private String phoneType;public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getZipCode() {return zipCode;}public void setZipCode(String zipCode) {this.zipCode = zipCode;}public String getAreaCode() {return areaCode;}public void setAreaCode(String areaCode) {this.areaCode = areaCode;}public String getPhoneType() {return phoneType;}public void setPhoneType(String phoneType) {this.phoneType = phoneType;}@Override public String toString() {return "PhoneNumberInfo{" +"phoneNumber='" + phoneNumber + '\'' +", province='" + province + '\'' +", city='" + city + '\'' +", zipCode='" + zipCode + '\'' +", areaCode='" + areaCode + '\'' +", phoneType='" + phoneType + '\'' +'}';}
}

文件存放路径建议

调用的代码如下,这段代码可以放在for循环里面去执行,效率肯定比单个去请求开放的API效率高很多,已经测试过好几批手机号数据(均为7000+条以上),查询不到的也就剩下几十条,这个可以单独去请求开放API获得手机号码归属地,我这里没有,可以自行搜索相关实现方法。

 String phoneNum = '13609257706'PhoneNumberGeo phoneNumberGeo = new PhoneNumberGeo();PhoneNumberInfo phoneNumberInfo = phoneNumberGeo.lookup(val);if(null!=phoneNumberInfo){//获取省份String province = phoneNumberInfo.getProvince();//获取城市 需要其他的参数自行查找PhoneNumberInfo类获取String city = phoneNumberInfo.getCity();System.out.println(province+"\t"+city);}else{System.out.println("请单独去查询");}

有问题请随时@我,邮箱648695686@qq.com

java学习笔记(三)手机号码归属地批量查询的代码,亲测可用相关推荐

  1. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  2. 个人永久性免费-Excel催化剂功能第99波-手机号码归属地批量查询

    高潮过往趋于平静,送上简单的手机号码归属地查询,因接口有数量限制,仅能满足少量数据需求,如有大规模数据却又想免费获得,这就成为无解了,数据有价,且用且珍惜. 业务使用场景 除了日常自带的手机各种管家为 ...

  3. SQL学习笔记(三): 视图与一些复杂查询(虽复杂但常用)

    1. 写在前面 最近需要用到HQL语句做一些数据分析的工作,又发现了自己的短板, HQL这个东西用起来并不是很流畅,虽然建表,查询的基本语句还能应付(这还是吃的大学的SQL基础老本), 但涉及到一些复 ...

  4. java注解和反射——狂神说java学习笔记三

    原文链接:公众号狂神说 视频教程[狂神说B站]: https://www.bilibili.com/video/BV12J41137hu 如有侵权,联系立删 什么是注解 Annotation是从JDK ...

  5. 【Java学习笔记三】抽象类与接口

    对象的类型转换分为自动转换和强制转换两种 派生类向基类转换是自动转换,因为派生类中包含基类 基类向派生类的转换是强制转换 强制类型转换是通过在转换对象前面使用圆括号运算符来实现,圆括号内为要转换的目标 ...

  6. Java学习笔记三——数据类型

    前言 Java是强类型(strongly typed)语言,强类型包含两方面的含义: 所有的变量必须先声明后使用: 指定类型的变量只能接受预支匹配的值. 这意味着每一个变量和表达式都有一个在编译时就确 ...

  7. JAVA学习笔记(三十一)-电影系统案例

    伪代码 系统的角色类准备 用户购票 用户评分 商家功能 首页设计 先封装 public class Business extends User{// 店铺名称private String shopNa ...

  8. JAVA学习笔记(三十九)-打印流

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; i ...

  9. java学习笔记(三)----成员权限,构造函数,this用法

    成员权限                         本类    同包类    非同包子类    非同包非子类 public         y        y               y  ...

  10. 疯狂java学习笔记三

    面向对象 1.继承 extends关键字 抽象类 implement关键字 java1.8(函数式接口)–>Lamba表达式–>foreach方法–>函数接口 java1.8默认方法 ...

最新文章

  1. linux下mysql中文乱码
  2. 链队列的基本运算java_链式队列基本操作的实现问题
  3. 漫谈高数曲线积分的物理意义
  4. linux内核那些事之物理内存模型之FLATMEM(1)
  5. Spring—使用类加载从配置文件中读取配置
  6. mysql容器重启数据是否丢失_docker容器重启 数据会丢吗
  7. clock_gettime系统调用详解
  8. 这可能是国内首款5G手机了!中兴AXON 10 Pro 5G上市定档
  9. android配置多个url,Retrofit中使用多个baseUrl
  10. 简单易懂的程序语言入门小册子(3):基于文本替换的解释器,let表达式,布尔类型,if表达式...
  11. javascript第四弹——变量、作用域、内存
  12. 阶段3 1.Mybatis_11.Mybatis的缓存_2 延迟加载和立即加载的概念
  13. Python入门之面向对象module,library,package之间区别
  14. 实例mysql范式_数据库范式的范式应用实例
  15. 【航模】凤凰模拟器安装
  16. 求长方形和正方形的周长
  17. kindle可以上网但是无法下载_您的Kindle已连接WiFi网络,但无法连接互联网的解决办法...
  18. cmd命令打开文本文档_win7定时关机命令 【处置技巧】
  19. C# System.Net.Mail 类 使用465端口邮件不成功
  20. Hive DML 语句操作报错

热门文章

  1. python开三次方_python 三次方
  2. QT基于Npcap设计的网络抓包小程序
  3. 渗透第一个靶机 shop1.0 (还是简单渗透版)
  4. 三角形外接圆圆心 算法 删改版
  5. 数学建模与数学实验P49第四题解答
  6. 遥感原理与应用-基本概念
  7. 开源ext2read代码走读之-如何读取MBR分区的内容
  8. linux驱动开发期末测试,超星尔雅Linux驱动开发实训期末测试答案
  9. Oracle定时任务使用
  10. CAD(2007)学习笔记