本文实例为大家分享了Java实现ATM机操作系统的具体代码,供大家参考,具体内容如下
用IO流操作txt文件作为数据库模拟实现一个ATM业务操作系统---->网上银行,实现登录,查询余额,存款,取款,转账,开户,销户等业务功能
看代码
1.用户类----->User:
package atm;
import java.io.Serializable;
public class User implements Serializable{
//建议除了私有属性 无参数有参数构造方法 属性对应的get、set方法
//建议类实现一个序列化接口 添加一个序列化版本号
private static final long serialVersionUID = 1L;
//只是为了记录数据库中的一行信息 账号 密码 余额
private String aName;
private String aPassword;
private Float aSalary;
public User() {}
public User(String aName,String aPassword,Float aSalary) {
this.aName = aName;
this.aPassword = aPassword;
this.aSalary = aSalary;
}
public String getaName() {
return this.aName;
}
public void setaName(String newName) {
this.aName = newName;
}
public String getaPassword() {
return this.aPassword;
}
public void setaPassword(String newPassword) {
this.aPassword = newPassword;
}
public Float getSalary() {
return this.aSalary;
}
public void setSalary(Float newSalary) {
this.aSalary = newSalary;
}
}
2.操作IO的类------>FileLoadAndCommit:
package atm;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
//操作文件
public class FileLoadAndCommit {
//文件路径
private String pathName = null;
public FileLoadAndCommit(String pathName) {
this.pathName = pathName;
}
//读取文件装入集合
public HashMap<String,User> loadFile(){
//临时的存储空间,将文件中读取的数据存储以便于修改
HashMap<String,User> userBox = new HashMap<String,User>();
//IO流读取
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(new File(pathName));
br = new BufferedReader(fr);
String code = br.readLine();//读取一行
//循环遍历所有行 按"-"拆分一行的数据,作为User存入集合
while(code != null) {
String[] value = code.split("-");
User user = new User(value[0],value[1],Float.parseFloat(value[2]));
userBox.put(user.getaName(),user);
code = br.readLine();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
//如果流管道存在,才关闭
if(fr != null) {
fr.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(br != null) {
br.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return userBox;
}
//将集合更新入文件
public void commit(HashMap<String,User> userBox) {
//IO流写入
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(new File(pathName));
bw = new BufferedWriter(fw);
//迭代集合内所有账户名 按账户名找到对应的User对象
Iterator<String> names = userBox.keySet().iterator();
while(names.hasNext()) {
String name = names.next();
User user = userBox.get(name);
//用StringBuilder拼接字符串
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(user.getaName());
sBuilder.append("-");
sBuilder.append(user.getaPassword());
sBuilder.append("-");
sBuilder.append(user.getSalary());
bw.write(sBuilder.toString());//将拼好的一行数据写入文件
bw.flush();//刷新
bw.newLine();//换行
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//必须先关闭BufferedWriter再关闭FileWrite,否贼会抛异常java.io.IOException: Stream closed
try {
if(bw != null) {
bw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(fw != null) {
fw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.负责读写的类----->AtmDao:
package atm;
import java.util.HashMap;
//持久化,负责读写数据,缓存
public class AtmDao {
private FileLoadAndCommit flac = new FileLoadAndCommit("D:\\test\\ATM\\testATM.txt");
HashMap<String,User> userBox = flac.loadFile();
//获取一个User对象
public User selectOne(String aName) {
return userBox.get(aName);
}
//更新文件数据
public void update(User user) {
userBox.put(user.getaName(),user);
flac.commit(userBox);
}
//删除文件数据
public void delete(User user) {
userBox.remove(user.getaName(),user);
flac.commit(userBox);
}
}
4.负责业务逻辑的类------>ATMService:
package atm;
import java.util.HashMap;
//负责业务逻辑 判断 比较 计算
public class ATMService {
//登录
private AtmDao dao = new AtmDao();
public String login(String aName,String aPassword) {
User user = dao.selectOne(aName);
if(user!=null) {
if(aPassword.equals(user.getaPassword())) {
return "登录成功";
}
}
return "用户名或密码错误";
}
//查询余额
public Float inquiry(String aName) {
User user = dao.selectOne(aName);
return user.getSalary();
}
//存款
public void addMoney(String aName,Float addMoney) {
User user = dao.selectOne(aName);//获取该用户对象
user.setSalary(user.getSalary()+addMoney);//用User的set方法修改用户金额
dao.update(user);//更新文件数据
System.out.println("存款成功\n");
}
//取款
public void getMoney(String aName,Float getMoney) {
User user = dao.selectOne(aName);//获取该用户对象
if(getMoney <= user.getSalary()) {//如果要取出的钱大于余额就不能取了
user.setSalary(user.getSalary()-getMoney);
dao.update(user);
System.out.println("取款成功\n");
}else {
System.out.println("对不起,您的余额不足\n");
}
}
//转账
public void transferMoney(String outName,String inName,Float transferMoney) {
User outUser = dao.selectOne(outName);//转出用户
User inUser = dao.selectOne(inName);//转入用户
if(inUser!=null) {//转入用户存在
if(outUser!=inUser) {//转出和转入用户不能是同一个用户
if(transferMoney <= outUser.getSalary()) {//转出金额大于余额就不能转了
outUser.setSalary(outUser.getSalary()-transferMoney);//修改转出用户余额
inUser.setSalary(inUser.getSalary()+transferMoney);//修改转入用户余额
//更新文件数据
dao.update(outUser);
dao.update(inUser);
System.out.println("转账成功\n");
}else {
System.out.println("对不起"+outName+",您的余额不足\n");
}
}else {
System.out.println("对不起,不能给自己转账,您可以试试使用存款业务\n");
}
}else {
System.out.println("对不起,您输入的用户不存在\n");
}
}
//开户
public User creatUser(String aName,String aPassword,Float aSalary) {
User user = new User(aName,aPassword,aSalary);
dao.update(user);//更新文件数据
System.out.println("用户"+aName+",创建成功");
return user;
}
//销户
public void deleteUser(String aName) {
User user = dao.selectOne(aName);//获取名为aName的用户
if(user != null) {//判断该用户是否在文件数据内存在
dao.delete(user);
System.out.println("用户"+aName+",删除成功");
}else {
System.out.println("要销毁的账户不存在");
}
}
}
5.测试类----->TestMain:
package atm;
import java.util.Scanner;
public class TestMain {
public static void main(String[] args) {
ATMService atmService = new ATMService();//获取执行业务的方法
Scanner input = new Scanner(System.in);
System.out.println("欢迎进入ATM机系统");
System.out.println("请选择要操作的业务:\n1.用户登录\n2.开户\n3.按任意键退出");
String choice = input.next();
if(choice.equals("1")) {
System.out.println("请输入账户名");
String name = input.next();
System.out.println("请输入密码");
String password = input.next();
String afterLogin = atmService.login(name,password);//判断输入的账户名密码是否正确
if(afterLogin.equals("登录成功")) {//if正确则登录成功
System.out.println("登录成功!\n");
//使用while循环反复进行switch执行操作业务
while(true) {
System.out.println("请选择服务项目:");
System.out.println("1.查询\n2.存款\n3.取款\n4.转账\n5.销户\n(按q退出系统)");
String option = input.next();
switch (option) {
case "1":
//查询
Float money = atmService.inquiry(name);
System.out.println("尊敬的客户,您的余额为"+money+"元\n");
break;
case "2":
//存款
System.out.println("请输入存款金额");
Float addMoney = input.nextFloat();
atmService.addMoney(name,addMoney);
break;
case "3":
//取款
System.out.println("请输入取款金额");
Float getMoney = input.nextFloat();
atmService.getMoney(name,getMoney);
break;
case "4":
//转账
System.out.println("请输入转账用户ID:");
String id = input.next();
System.out.println("请输入转账金额:");
Float transferMoney = input.nextFloat();
atmService.transferMoney(name,id,transferMoney);
break;
case"5":
//销户
System.out.println("您确定要销毁当前账户吗?账户内所有余额都会消失\nYes/No\n");
String decision = input.next();
if(decision.equalsIgnoreCase("yes")) {
atmService.deleteUser(name);//删除当前user数据
}else if(decision.equalsIgnoreCase("no")){
break;
}
break;
case "q":
System.out.println("已退出ATM机系统,感谢您的使用!!!");
System.exit(0);//退出程序
break;
default:
System.out.println("请输入正确的指令\n");
break;
}
}
}else {
System.out.println(afterLogin);
}
}else if(choice.equals("2")){
//开户
System.out.println("请设置您的用户名");
String newUserName = input.next();
System.out.println("请设置您的密码");
String newPassword = input.next();
User newUser = atmService.creatUser(newUserName, newPassword, 0.0F);
System.out.println("\n初始余额为"+newUser.getSalary()+"元");
}else {
System.out.println("已退出ATM机系统,感谢您的使用!!!");
}
}
}
部分运行结果:
1.账户登录
2.查询
3.存款
4.退出
作为数据库的txt文件:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。