我的Java学习之路(12)-- IO模拟手机号携号转网功能

IO模拟手机号携号转网功能

  • 一、功能说明
  • 二、思路
  • 三、代码实现
    • 1. 首先是用户实体类
    • 2. 移动公司类
    • 3. 联通公司类
    • 4. 最后是程序入口类
  • 四、演示效果图

一、功能说明

  • 根据国家政策,目前中国移动和中国联通开启了携号转网的活动:移动–>联通
  • 用户需要根据自己输入信息,到移动公司进行申请,用户输入信息,移动查询是否欠费,不欠费,将数据写入文件,欠费不予办理;
  • 前往联通公司办理业务,联通公司读取对象流,将数据添加到联通公司服务器,办理成功

二、思路

1. 构建用户对象:姓名、身份证号、资费金额、手机号码
2. 用户首先登陆移动信息,通过RandomAccessFile读取自己服务器文件cm.txt
3. 判定用户是否存在,判定是否欠费
4. 移动服务器将用户数据序列化,放入到 data.txt中
5. 用户前往联通大厅,联通服务器读取data.txt中,读取信息
6. 联通服务器将数据写入自己服务器cu.txt

数据文件格式如下:

编码格式:utf-8
姓名:12个字节
手机号:11个字节
身份证号:18个字节
资费:6个字节

李白   15312341234421421198912245299-136.5
孙尚香  15312341234421421198912245299+106.5
鲁班七号15312341234421421198912245299-126.5
王昭君  15312341234421421122112245299+336.5
诸葛亮  15312341234421421100112245299+536.5
妲己   15312341234421421198912245299-106.5
小乔   15312341234421421198912245299-236.5

三、代码实现

1. 首先是用户实体类

User.java

package com.feonix;

import java.io.Serializable;

/**
 * 用户类 实现 序列化接口(后面要用到序列化,所以这里必须实现序列化接口)
 * 
 * @author FeoniX
 *
 */
public class User implements Serializable {
	// 序列化唯一ID
	private static final long serialVersionUID = -571955106719025344L;
	/** 姓名 */
	private String name;
	/** 身份证号 */
	private String idCard;
	/** 手机号 */
	private String mobile;
	/** 资费金额 */
	private String cost;

	public User() {
		super();
	}

	public User(String name, String idCard, String mobile, String cost) {
		super();
		this.name = name;
		this.idCard = idCard;
		this.mobile = mobile;
		this.cost = cost;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getIdCard() {
		return idCard;
	}

	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public String getCost() {
		return cost;
	}

	public void setCost(String cost) {
		this.cost = cost;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", idCard=" + idCard + ", mobile=" + mobile + ", cost=" + cost + "]";
	}

}

2. 移动公司类

Cmcompany.java

package com.feonix;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 移动公司类
 * 
 * @author FeoniX
 *
 */
public class Cmcompany {
	private List<User> users;

	public Cmcompany() {
		super();
		this.users = new ArrayList<User>();
		initData();
	}

	/**
	 * 初始化数据
	 * 
	 * @throws IOException
	 */
	private void initData() {
		File cmdata = new File("data/cm.txt");
		RandomAccessFile raf = null;
		try {
			if (!cmdata.exists()) {
				cmdata.createNewFile();
			}
			raf = new RandomAccessFile(cmdata, "r");
			while (raf.read() != -1) {
				// 设置指针位置为当前位置的前一个位置
				raf.seek(raf.getFilePointer() - 1);
				// 读取姓名
				byte[] bname = new byte[12];
				String name = getData(raf, bname);
				// 读取手机号
				byte[] bMobile = new byte[11];
				String mobile = getData(raf, bMobile);
				// 读取身份证号
				byte[] bIdCard = new byte[18];
				String idCard = getData(raf, bIdCard);
				// 读取资费金额
				byte[] bCost = new byte[6];
				String cost = getData(raf, bCost);
				// 跳过回车换行
				raf.skipBytes(2);

				users.add(new User(name.trim(), idCard, mobile, cost));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (raf != null) {
				try {
					raf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 检查用户状态
	 * 
	 * @param name
	 * @return
	 */
	private User checkUser(String name) {
		User user = null;
		for (User u : users) {
			if (name.equals(u.getName())) {
				// 找到对应的用户了
				user = u;
				break;
			}
		}

		if (user == null) {
			System.out.println("用户不存在\n");
			return null;
		}

		if (Double.parseDouble(user.getCost()) < 0) {
			System.out.println("账户欠费,不予办理\n");
			return null;
		}

		return user;
	}

	/**
	 * 获取用户数据
	 * 
	 * @param name
	 * @return
	 * @throws IOException
	 */
	public File getUserData() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("欢迎您来到移动营业厅办理携号转网业务");
		System.out.print("请输入您的姓名:");
		String name = scanner.next();
		scanner.close();

		// 检查用户状态
		User user = checkUser(name);
		if (user == null) {
			return null;
		}

		File data = new File("data/data.txt");
		ObjectOutputStream oops = null;

		try {
			if (!data.exists()) {
				// 检查文件状态,不存在就创建新文件
				data.createNewFile();
			}
			// 实例化对象输出流
			oops = new ObjectOutputStream(new FileOutputStream(data));
			// 把当前用户序列化写入data文件
			oops.writeObject(user);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (oops != null) {
				try {
					oops.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		System.out.println("办理成功,请前往联通营业厅办理后续手续\n");

		return data;
	}

	/**
	 * 获取指定字段的数据
	 * 
	 * @param raf
	 * @param bs
	 * @return
	 * @throws IOException
	 */
	private String getData(RandomAccessFile raf, byte[] bs) throws IOException {
		raf.read(bs);
		String data = new String(bs);
		return data;
	}
}

3. 联通公司类

Cucompany.java

package com.feonix;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.RandomAccessFile;

/**
 * 联通公司类
 * 
 * @author FeoniX
 *
 */
public class Cucompany {
	/**
	 * 保存用户数据
	 * 
	 * @param data
	 */
	public void saveData(File data) {
		if (data == null) {
			return;
		}
		System.out.println("联通营业厅欢迎您来办理携号转网业务");
		User user = null;
		ObjectInputStream ois = null;
		RandomAccessFile raf = null;
		try {
			// 实例化对象输入流
			ois = new ObjectInputStream(new FileInputStream(data));
			// 读取用户数据
			user = (User) ois.readObject();
			if (user == null) {
				System.out.println("用户数据读取失败,或用户数据不存在\n");
				return;
			}
			System.out.println("您的账户信息为:" + user);
			// 实例化随机文件读写器
			raf = new RandomAccessFile(new File("data/cu.txt"), "rw");
			// 设置指针为文件末尾
			raf.seek(raf.length());
			// 处理名字
			byte[] bname = new byte[12];
			byte[] name = user.getName().getBytes();
			for (int i = 0; i < name.length; i++) {
				bname[i] = name[i];
			}
			for (int j = name.length; j < 12; j++) {
				// 补空格
				bname[j] = " ".getBytes()[0];
			}
			// 写入名字
			raf.write(bname);
			// 写入手机号
			raf.write(user.getMobile().getBytes());
			// 写入身份证号
			raf.write(user.getIdCard().getBytes());
			// 写入资费金额,携号转网金额不转过来,所以为0
			raf.write(String.format("%1$-6s", "+0.0").getBytes());
			// 写入回车换行
			raf.write("\r\n".getBytes());

			System.out.println("恭喜您办理成功,欢迎下次光临\n");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (raf != null) {
				try {
					raf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (ois != null) {
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

4. 最后是程序入口类

Main.java

package com.feonix;

public class Main {
	public static void main(String[] args) {
		Cmcompany cmcompany = new Cmcompany();
		Cucompany cucompany = new Cucompany();
		cucompany.saveData(cmcompany.getUserData());
	}
}

四、演示效果图

我的Java学习之路(12)-- IO模拟手机号携号转网功能_第1张图片
我的Java学习之路(12)-- IO模拟手机号携号转网功能_第2张图片


一个简单的IO流小例子,拿来献丑了。我这里查询用户是根据名字匹配的,没有考虑重名问题,可以改成按手机号去查询,运营商数据库里面手机号是不会重复的。

我的Java学习之路(12)-- IO模拟手机号携号转网功能_第3张图片

你可能感兴趣的:(Java)