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
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 + "]";
}
}
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;
}
}
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();
}
}
}
}
}
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());
}
}
一个简单的IO流小例子,拿来献丑了。我这里查询用户是根据名字匹配的,没有考虑重名问题,可以改成按手机号去查询,运营商数据库里面手机号是不会重复的。