当前位置:

首页 > 编程开发 > Java如何实现ATM机操作系统

Java如何实现ATM机操作系统

用IO流操作txt文件作为数据库模拟实现一个ATM业务操作系统---->网上银行,实现登录,查询余额,存款,取款,转账,开户,销户等业务功能1.用户类----->User:packageatm;importjava.io.Serializable;publicclassUserimplementsSerializable{//建议除了私有属性无参数有参数构造方法属性对应的get、set方法//建议类实现一个序列化接口添加一个序列化版本号privatestaticfinallongserialVersion

本文目录

    用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 loadFile(){
            //临时的存储空间,将文件中读取的数据存储以便于修改
            HashMap userBox = new HashMap();
            //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 userBox) {
            //IO流写入
            FileWriter fw = null;
            BufferedWriter bw = null;
            try {
                fw = new FileWriter(new File(pathName));
                bw = new BufferedWriter(fw);
                
                //迭代集合内所有账户名    按账户名找到对应的User对象
                Iterator 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 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.账户登录

    Java如何实现ATM机操作系统

    2.查询

    Java如何实现ATM机操作系统

    3.存款

    Java如何实现ATM机操作系统

    4.退出

    Java如何实现ATM机操作系统

    作为数据库的txt文件:

    Java如何实现ATM机操作系统

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。