小任务:
1.实现一个银行业务系统
2.要求有如下的业务功能
登录
查询余额
存款
取款
转账
开户
销户
3.记录银行的用户信息
账号–密码–余额 BufferedReader readLine ObjectOutputStream

一、序列化版本

  • 1.1 什么是序列化?什么是反序列化?
  • 答:序列化是计算机内存中存储的信息,写入到磁盘的文件中。反序列化磁盘里文件中的信息,读入到计算机内存中。
  • 1.2 为什么要进行固定化序列化版本?
  • 答:内存中临时储存的信息与磁盘中存储的信息,常常需要读入和写出进行转换。如果运行的环境是在不同的java版本,或者其它不同环境下,可能会造成IO流传输转码解析错误。因此,需要用一个属性来对比,看前后信息的一致。如果属性值一样,说明是同一个运行环境,才能进行有效的读写信息。

1.1 类:实现序列化接口

1.2 ideal编辑器设置:自动生成序列化



1.3 类:鼠标光标放类名上面可看到序列化版本提示:点击自动固定生成。


二、银行系统


package atmsystem;import java.io.Serializable;/*** @author liuxian*/
public class User implements Serializable {//建议除了私有属性  无参数有参数构造方法  属性对应的get、set方法//建议类实现一个序列化接口  添加一个序列化版本号private static final long serialVersionUID = 1406005760612010227L;//只是为了记录数据库中的一行信息  账号  密码  余额private String aname;private String apassword;private Float abalance;public User(String aname, String apassword, Float abalance) {this.aname = aname;this.apassword = apassword;this.abalance = abalance;}public User() {}public String getAname() {return aname;}public String getApassword() {return apassword;}public Float getAbalance() {return abalance;}public void setAname(String aname) {this.aname = aname;}public void setApassword(String apassword) {this.apassword = apassword;}public void setAbalance(Float abalance) {this.abalance = abalance;}
}
package atmsystem;import java.io.*;
import java.util.HashMap;
import java.util.Iterator;/*** @author liuxian*/
public class AtmService {//这一个类都是负责处理业务逻辑  需要底层数据的支持private AtmDao dao=new AtmDao();//网络银行的业务//所有的业务方法,按照我们之前的优化结构设计//只有业务逻辑  判断 比较  计算等等//看不见任何数据的操作  从哪儿查出来的  存在哪儿//设计一个业务方法  登录public String login(String aname,String apassword){//        try {
//            //创建一个输入流  读取真实文件的记录
//            File file=new File("src\\atmsystem\\User.txt");
//            FileReader fileReader=new FileReader(file);
//            BufferedReader bufferedReader=new BufferedReader(fileReader);
//            String value = bufferedReader.readLine();//value表示一行人的所有信息
//            while(value!=null){//柳先生-123-800
//                String[] user = value.split("-");//user数组储存的是一个人的信息
//                if (user[0].equals(aname)){
//                    if (user[1].equals(apassword)){
//                        return "登录成功";
//                    }
//                }
//                value=bufferedReader.readLine();
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }User user=dao.selectOne(aname);if (user!=null&& user.getApassword().equals(apassword)){return "登录成功";}return "用户名或密码错误";}//设计一个业务的方法  查询余额public Float queryBalance(String aname){User user=dao.selectOne(aname);return user.getAbalance();}//设计一个业务方法  存款  数据中做修改   某一行记录public void deposit(String aname,Float depositMoney){//先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改User user=dao.selectOne(aname);user.setAbalance(user.getAbalance()+depositMoney);dao.update(user);//dao.commit();//提交  将临时的数据永久的写入文件  事务}//设计一个业务方法  取款public void withdrawal(String aname,Float withdrawalMoney){//先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改User user=dao.selectOne(aname);if (user.getAbalance()>withdrawalMoney){user.setAbalance(user.getAbalance()-withdrawalMoney);dao.update(user);//this.commit();//提交  将临时的数据永久的写入文件  事务}else {System.out.println("对不起"+aname+"您的账户余额不足");}}//设计一个业务方法  转账public void transfer(String outName,String inName,Float transferMoney){//先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改User outUser=dao.selectOne(outName);if (outUser.getAbalance()>transferMoney){User inUser = dao.selectOne(inName);if (inUser!=null){//转入账户是存在的outUser.setAbalance(outUser.getAbalance()-transferMoney);inUser.setAbalance(inUser.getAbalance()+transferMoney);dao.update(outUser);//this.update(inUser);//this.commit();//提交  将临时的数据永久的写入文件  事务}else {System.out.println("对不起,您输入的转入账户不存在");}}else {System.out.println("对不起"+outName+"您的账户余额不足");}}
}
package atmsystem;import java.io.*;
import java.util.HashMap;
import java.util.Iterator;/*** @author liuxian*/
public class AtmDao {//DAO作为一个层次---持久层  操作数据  读写数据//dao中还有一个小弟  负责加载文件  更新文件数据private FileLoaderAndCommit flac=new FileLoaderAndCommit("src\\atmsystem\\User.txt");//发现登陆的方法 每一次调用都需要创建流管道  读取文件的信息//内存中操作登陆的业务  文件不在一个地方  认为读取的过程很慢//想到一个解决方案  创建一个map集合充当缓存  将文件中的数据全都读出来 读一次//一行记录  创建一个对象存起来  一个人   一个对象  三个属性//集合除了可以充当缓存  增强执行性能以外  还能用来做记录的修改private HashMap<String,User> userBox=flac.loadFile();//设计一个方法 目的是为了我的所有业务服务//有参数  账号名  返回值  一个对象Userpublic User selectOne(String aname){return userBox.get(aname);//这里是一行  以后如果不是一行的时候  只需要改变这个方法}//设计一个方法  目的是为了将某一个修改完毕的对象存入集合public void update(User user){userBox.put(user.getAname(), user);//集合做了修改flac.commit(userBox);}
}
package atmsystem;import java.io.*;
import java.util.HashMap;
import java.util.Iterator;/*** @author liuxian*/
public class FileLoaderAndCommit {private String fileName=null;public FileLoaderAndCommit(String fileName){this.fileName=fileName;}//程序块的目的在对象创建之前  给集合进行赋值操作public HashMap<String,User> loadFile(){HashMap<String,User> userBox=new HashMap<String, User>();FileReader fileReader=null;BufferedReader bufferedReader=null;try {//创建一个输入流  读取真实文件的记录File file=new File(fileName);fileReader=new FileReader(file);bufferedReader=new BufferedReader(fileReader);String value = bufferedReader.readLine();while (value!=null){//value的信息拆分成三段  构建一个User对象   三个属性刚好存储  对象存入集合String[] userValue = value.split("-");User user=new User(userValue[0],userValue[1],Float.parseFloat(userValue[2]));userBox.put(user.getAname(), user);//put(账号,User对象)value=bufferedReader.readLine();}} catch (Exception e) {e.printStackTrace();}finally {if (fileReader!=null){try {fileReader.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader!=null){try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}return userBox;}//设计一个方法  目的是为了将集合内的所有数据写入文件public void commit(HashMap<String,User> userBox){//数据库--->commit提交--->事务FileWriter fileWriter=null;BufferedWriter bufferedWriter=null;try {//创建一个字符型文件输出流File file=new File(fileName);fileWriter=new FileWriter(file);bufferedWriter=new BufferedWriter(fileWriter);Iterator<String> names = userBox.keySet().iterator();while (names.hasNext()){String name = names.next();//集合内获取的某一个人名User user = userBox.get(name);//记录一个人的真实数据//将user对象中的真实数据拼接成一行字符串StringBuffer builder=new StringBuffer(user.getAname());builder.append("-");builder.append(user.getApassword());builder.append("-");builder.append(user.getAbalance());//字符型文件输出流将拼接好的builder写入文件bufferedWriter.write(builder.toString());bufferedWriter.newLine();bufferedWriter.flush();}} catch (IOException e) {e.printStackTrace();}finally {if (fileWriter!=null){try {fileWriter.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedWriter!=null){try {bufferedWriter.close();} catch (IOException e) {e.printStackTrace();}}}}
}
package atmsystem;import java.util.Scanner;/*** @author liuxian*/
public class TestMain {public static void main(String[] args) {AtmService service=new AtmService();Scanner input=new Scanner(System.in);System.out.println("欢迎您使用银行自助服务系统\n请输入账号:");String aname=input.nextLine();System.out.println("请输入密码");String apassword=input.nextLine();String loginResult = service.login(aname, apassword);System.out.println(loginResult);if (loginResult.equals("登录成功")){System.out.println("恭喜您登录成功,请你输入操作项");System.out.println("查询请输入1\n存款输入2\n取款请输入3\n转账请输入4\n退出请输入5\n如需帮助请拨打电话1234567890");String option=input.nextLine();switch (option){case "1":Float abalance = service.queryBalance(aname);System.out.println("尊敬的用户,您可用的余额为"+abalance);break;}}else {System.out.println("对不起,"+loginResult);}}
}

小任务:简单实现银行业务系统(附 ideal编辑器固定序列化版本方法)相关推荐

  1. xp计算机关闭139端口,小编搞定xp系统电脑关闭139端口的图文方法

    我们在使用xp系统的过程中,经常需要对xp系统电脑关闭139端口进行设置,可能很多用户都不知道怎么对xp系统电脑关闭139端口进行设置,但当我们遇到对xp系统电脑关闭139端口的设置方法非常简单,只需 ...

  2. win7无线网突然上不了网桌面有个黄色三角叹号dns服务器未响应,Win7系统DNS服务器未响应的解决方法...

    在平时的工作中,我们常常会遇到一些问题,比较常见的就是DNS服务器问题了.相信有很多用户遇到了DNS服务器未响应可能会不知道怎么办?其实很好解决的,下面就由小编教大家Win7系统DNS服务器未响应的解 ...

  3. 计算机重启的两种方法,Win10系统自动重启的两种关闭方法

    大家在使用 Win10系统 的过程当中,可能会遇到一个情况,电脑总是会自动关机重启或者重启关机后又自动重启,这种状况要如何处理呢?其实很简单,只需将系统中的自动重启设置给关闭了就可以解决.下面小编就教 ...

  4. ise怎么更改编辑器_Win7系统时间更改不了的解决方法

    众所周知,在windows系统的桌面右下角处会有时间与日期显示,但是在近期一个用户在更改计算机时间的时候,发现系统时间更改不了,并提示"无法继续,您没有执行此操作的权限.请联系的计算机管理员 ...

  5. win7无法看到工作组计算机,Win7系统无法查看工作组问题的解决方法

    Win7系统无法查看工作组怎么办?在日常工作中,很多工作团队为了局域网传输方便,就会设置工作组.不过在方便传输的同时也会碰到一些问题,比如用户所在的工作团队需要三台电脑交流,同一系统.同一路由器网络下 ...

  6. 计算机连接不上蓝牙鼠标,图文教您win7系统蓝牙鼠标连接不上的处理方法

    大家在使用电脑的过程中,有没有遇到过win7系统蓝牙鼠标连接不上的问题,大部分朋友还是不知道win7系统蓝牙鼠标连接不上的情况应该怎么解决,针对win7系统蓝牙鼠标连接不上的问题,我给大家整理总结了详 ...

  7. win10计算机本地无法连接,win10系统电脑本地连接不见了解决方法

    电脑使用久了总是会出现一些故障,其中最常见的就是本地连接不见了.本地连接不见了大概有些网络故障大家就没有法处理了,那么当你碰到win10本地连接不见了如何办呢?不熟悉的朋友赶紧看看小编整理的win10 ...

  8. 系统装完以后无法启动计算机,系统重装后不能启动的解决方法

    在我们使用ghostwin7旗舰版电脑过程中,当遇到了一些电脑故障无法解决的时候很多人都是选择直接重装系统,毕竟重装系统并不是一件什么难事,但是如果系统重装后不能启动怎么办呢?最近就有用户遇到系统重装 ...

  9. [附源码]计算机毕业设计springboot基于微信小程序的网络办公系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  10. (附源码)springboot基于微信小程序的校园外卖系统 毕业设计091024

    Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...

最新文章

  1. 使用计算机中的库教案,计算机应基础全部教案.doc
  2. 怎么修改windows控制台编码?(不改了)
  3. Java 多个引用类型变量引用同一个对象
  4. java 时间工具类 大于_Java 时间工具类
  5. 关于Pac-Man,你所要了解的 一切
  6. 以太网和局域网的关系
  7. ASP.Net缓存总结
  8. sqlite journal恢复数据_数据库是咋工作的?
  9. markdown转换html源码,利用Nodejs+Express将Markdown转换为HTML(附源码)
  10. Linux Cgroups详解(一)
  11. (转) QImage总结
  12. Python多进程之Pool
  13. C++ RGB转灰度图像
  14. 【转载】Java并发编程:volatile关键字解析 by 海子
  15. js实现图片连续滚动播放
  16. java课程报告答辩_Java课程设计答辩之感想
  17. 洒脱喜详解Layer 2:以太坊L2将是多rollup并存的局面,跨链领域值得探索
  18. 【厚积薄发系列】C++项目总结14—Windows平台下异常捕获不到问题分析
  19. ERP实施顾问是干什么的?
  20. 数据挖掘教程:什么是数据挖掘?技术,工艺

热门文章

  1. Linux打印显示时间
  2. JAVA五子棋小游戏
  3. 如何使用FreeTextBox
  4. Java基础资料整理
  5. 怎么在ASP.NET中引用JS文件
  6. 怎么关闭计算机硬件加速,win7关闭硬件加速的方法,手把手抓图教你如何关闭硬件加速功能...
  7. C#网络编程(Socket编程)
  8. PMP考试需要准备什么教材呢?
  9. 世界中英文国家及国家代码
  10. WEB浏览器页面上可视化展示JSON数据的方法