📄 mobilesearcher.java
字号:
package net.xdevelop.mobile;
import java.io.*;
import net.xdevelop.util.*;
/**
* <p>Title: 手机所属地查询工具类</p>
* <p>Description: 可通过手机号码查询手机所属省/市/SIM卡类型信息</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: www.xdevelop.net</p>
* @author starboy
* @version 1.0
*/
public class MobileSearcher {
// 初始化载入数据
private static boolean loaded = false;
private static boolean loadError = false;
private static String loadErrorInfo;
private boolean bError = false;
private String error;
static {
load();
}
private static MobileData mobile; // 手机归属数据
private int no = 100000; // 手机号码序号,即13(xxxxx)中的部分
private String mobileNo;
/**
* 待查询的手机号码是字符串类型的构造函数
* @param mobileNo 手机号码: 须大于等于7位且不超过11位, 超过7位的部分将被忽略, 但超出11位的将被认为是错误的号码
*/
public MobileSearcher(String mobileNo) {
init(mobileNo);
}
/**
* 待查询的手机号码是long数字类型的构造函数
* @param mobileNo 须大于等于7位且不超过11位, 超过7位的部分将被忽略, 但超出11位的将被认为是错误的号码
*/
public MobileSearcher(long mobileNo) {
init(Long.toString(mobileNo));
}
/**
* 初始化查询
* @param mobileNo 手机号码
*/
private void init(String mobileNo) {
this.mobileNo = mobileNo;
// 检查
// 1. 是否非NULL
// 2. 长度是否7<=len<=11, 介于7于11间的取7位
// 3. 是否13开头
if (mobileNo == null || mobileNo.equals("")) {
no = 100000; // 手机数据中保留的空值位置序号
bError = true;
error = "空的手机号码";
return;
}
int len = mobileNo.length();
if (len < 7 || len > 11) {
no = 100000;
bError = true;
error = "手机号码位数不对";
return;
}
if (!mobileNo.startsWith("13")) {
no = 100000;
bError = true;
error = "不是正确的手机号码";
return;
}
mobileNo = mobileNo.substring(2, 7);
try {
no = Integer.parseInt(mobileNo);
}
catch (Exception e) {
bError = true;
error = "不是正确的手机号码";
no = 100000;
}
}
/**
* 取得手机号码所属省或直辖市
* @return 手机号码所属省或直辖市,若无数据或手机号码不合法,将返回空串
*/
public String getProvince() {
if (loadError) {
return "";
}
return mobile.province[no];
}
/**
* 取得手机号码所属城市
* @return 手机号码所属城市,若无数据或手机号码不合法,将返回空串
*/
public String getCity() {
if (loadError) {
return "";
}
return mobile.city[no];
}
/**
* 取得手机号码所属的卡类型
* @return 手机号码所属的卡类型,若无数据或手机号码不合法,将返回空串
*/
public String getCard() {
if (loadError) {
return "";
}
return mobile.card[no];
}
/**
* 取得查询的手机号码
* @return 获得该查询的手机号码
*/
public String getMobileNo() {
return this.mobileNo;
}
/**
* 返回错误信息,若查询时出现错误,可通过此得到错误信息,主要供调试程序用.
* 通常的错误信息是手机号码不正确, 一般可以忽略不做任何检查,
* 但如果你发现总是无法获得期望的结果, 则你需要通过它查询错误原因.
* @return 错误信息
*/
public String getError() {
if (loadError) return loadErrorInfo;
else if (bError) {
return error;
} else {
return "";
}
}
/**
* 检查查询过程中是否出现意外错误,如果你发现查询总是未能获得期望的数据时,请调用此方法检查
* @return 若出错, 返回true, 否则返回false
*/
public boolean isError() {
return (loadError || bError);
}
/**
* 载入数据类
*/
private synchronized static void load() {
if (!loaded) {
mobile = new MobileLoader().loadMobileData();
if (mobile == null) {
loadError = true;
loadErrorInfo = "Can't load mobile data or the data was corrupted!";
}
loaded = true;
}
}
}
/**
* 数据装入类
*/
class MobileLoader {
/**
* 装入数据类,lazy initialization
*/
public MobileData loadMobileData() {
MobileData mobile;
DataInputStream in = null;
try {
InputStream inStream = getClass().getResourceAsStream("/net/xdevelop/mobile/mobile.dat");
in = new DataInputStream(new BufferedInputStream(inStream));
byte[] obj = new byte[3581541];
in.read(obj);
mobile = (MobileData)ByteArrayToObject(obj);
return mobile;
}
catch (Exception e) {
return null;
}
}
/**
* 将对象字节数组还原为object
* @param objArray 对象的字节数组
* @return 返回还原的对象
*/
private static Object ByteArrayToObject(byte[] objArray) throws Exception {
try {
InputStream in = new ByteArrayInputStream(objArray);
ObjectInputStream objectIn = new ObjectInputStream(in);
Object object = objectIn.readObject();
return object;
}
catch (Exception e) {
throw e;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -