Person类
package atm;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -7086234362131593577L;
private int id;//
private String name;
private String acount;//
private String passwd;
private double money;
public Person() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAcount() {
return acount;
}
public void setAcount(String acount) {
this.acount = acount;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", acount=" + acount + ", passwd=" + passwd + ", money=" + money
+ "]";
}
}
ATM核心类
package atm;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
public class ATM {
static int id = 0;
/**
* 这个person变量不可以初始化,必须在添加账户的时候再初始化,此person变量指当前的人
*/
private Person person = null;
public HashMap<String, Person> atm = new HashMap<>();
public HashMap<String, Person> getAtm() {
return atm;
}
public void setAtm(HashMap<String, Person> atm) {
this.atm = atm;
}
public Person reigster(String name, String passwd) {
person = new Person();
person.setId(++id);
person.setName(name);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
Date date = new Date();
String acount = sdf.format(date) + id;
person.setAcount(acount);
person.setPasswd(passwd);
atm.put(acount, person);
return person;
}
public Person land(String acount, String passwd) {
Person newPerson = atm.get(acount);
if (newPerson != null) {
if (newPerson.getAcount().equals(acount)) {
if (newPerson.getPasswd().equals(passwd)) {
// 登陆的时候把成员变量该为着个查询的到的变量
// 否则挡墙登陆的person就一直都是null
// 这就可能导致我遇到的问题:
// 转账之后当前对象就变成了对方,登陆的时候查询不到自己的信息
this.person = newPerson;
return newPerson;
} else {
System.out.println("密码错误");
return null;
}
} else {
System.out.println("账号错误");
return null;
}
} else {
System.out.println("没有这个账户");
return null;
}
}
public boolean save(double money) {
person.setMoney(person.getMoney() + money);
return true;
}
public boolean take(double money) {
person.setMoney(person.getMoney() - money);
return true;
}
public Person query() {
return this.person;
}
public void showAll() {
Collection<Person> s = atm.values();
for (Person a : s) {
System.out.println(a);
}
}
public boolean transfer(String newAcount, double addMoney) {
double m = atm.get(newAcount).getMoney();
atm.get(newAcount).setMoney(m + addMoney);
double n = person.getMoney();
person.setMoney(n - addMoney);
return true;
}
}
ATM测试类
package atm;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Scanner;
public class ATMTest {
public static void main(String[] args) {
ATM demo = new ATM();
System.out.println("欢迎使用火才ATM\n");
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("1.注册 2.登陆");
int i = sc.nextInt();
if (i == 1) {
System.out.println("请输入名字:");
String name = sc.next();
System.out.println("请输入密码");
String passwd = sc.next();
Person person = demo.reigster(name, passwd);
if (person != null) {
System.out.println("注册成功");
System.out.println(person);
// 注册成功之后就要将其存到文件中去
saveToFile(demo.getAtm());
} else {
System.out.println("注册失败");
}
}
if (i == 2) {
// 登陆的时候先加载文件中的信息加载到atm中
loadToAtm(demo);
sc = new Scanner(System.in);
System.out.println("请输入账号");
String acount = sc.next();
System.out.println("请输入密码");
String passwd = sc.next();
Person person = demo.land(acount, passwd);
if (person != null) {
System.out.println("登陆成功\n");
c: while (true) {
System.out.println("1.存钱 2.取钱 3.转账 4.查询 5.返回主菜单");
int j = sc.nextInt();
double money = 0;
switch (j) {
case 1:
System.out.println("请输入存多少钱");
money = sc.nextDouble();
demo.save(money);
System.out.println("存钱成功\n");
break;
case 2:
System.out.println("请输入取多少钱");
money = sc.nextDouble();
demo.take(money);
System.out.println("取钱成功\n");
break;
case 3:
sc = new Scanner(System.in);
System.out.println("请输入对方账号");
String newAcount = sc.next();
System.out.println("请输转多少钱");
money = sc.nextDouble();
demo.transfer(newAcount, money);
System.out.println("转钱成功\n");
break;
case 4:
System.out.println(demo.query());
break;
case 5:
// 当返回主菜单的时候就重新保存一次
saveToFile(demo.getAtm());
break c;
// case6作为调试的时候用查询各个人的信息
case 6:
demo.showAll();
break;
default:
break;
}
}
} else {
System.out.println("登陆失败");
}
}
}
}
// 将文件中的信息加载到ATM机中去
@SuppressWarnings("unchecked")
private static void loadToAtm(ATM demo) {
ObjectInputStream oos = null;
try {
oos = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("c:/atm.txt"))));
try {
demo.setAtm((HashMap<String, Person>) oos.readObject());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 将用户的账户信息保存到文件中
private static void saveToFile(HashMap<String, Person> atm) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("c:/atm.txt"))));
oos.writeObject(atm);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}