Java基于对象流实现银行系统
作者:发光吖 发布时间:2023-09-10 02:54:21
标签:Java,银行系统
Java基于对象流实现银行系统的具体代码,供大家参考,具体内容如下
系统特点:
数据持久化到文件中,系统启动后,加载文件中数据到集合中,相当于做了一个缓存。
文件读写使用的是对象流(ObjectInputStream和ObjectOutputStream),用户是看不懂那些文件的,一定程度上保证了密码和余额的安全性。
采用了MVC分层设计思想,虽然没有C控制层和V视图层,但是有完备的M模型层,数据处理Service,数据读写Dao,数据存储POJO(每一层只负责处理自己的事情,层次内部的改动不会影响其他层次)。
虽然有些细节问题由于时间关系没有处理好,比如没有处理输入类型不匹配的异常,但是绝大多数功能都合理得实现了。
全部代码
pojo:
public class User implements Serializable {
private static final long serialVersionUID = -7019656536540026883L;
private String username;//用户名
private String password;//密码
private Double balance;//余额
public User(String username, String password, Double balance) {
this.username = username;
this.password = password;
this.balance = balance;
}
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public String toString(){
StringBuilder builder = new StringBuilder("{");
builder.append(this.username).append(",").append(this.password).append(",").append(this.balance).append("}");
return builder.toString();
}
dao层:
public class ATMDao {
private String userFilePath = "src\\userMsg.txt";//相对路径
private HashMap<String, User> userMsg;
{
userMsg = this.loadFile();//读取文件信息
}
public HashMap<String, User> getUserMsg() {
return userMsg;
}
//查询用户
public User selectUser(String username){
return userMsg.get(username);
}
//更新用户信息
public void updateUser(User user){
this.userMsg.replace(user.getUsername(),user);
this.updateFile(userMsg);
}
//增加用户
public void addUser(User user){
this.userMsg.put(user.getUsername(),user);
this.updateFile(userMsg);
}
//删除用户
public void deleteUser(User user){
this.userMsg.remove(user.getUsername());
this.updateFile(userMsg);
}
//只在初始化时时调用一次
/* public void initFile(){
User user1 = new User("张三","123",800.0);
User user2 = new User("李四","666",70.0);
User user3 = new User("王五","888",555.0);
userMsg.put(user1.getUsername(),user1);
userMsg.put(user2.getUsername(),user2);
userMsg.put(user3.getUsername(),user3);
this.updateFile(userMsg);
}*/
private HashMap<String, User> loadFile(){
File file = new File(userFilePath);
FileInputStream fis = null;
ObjectInputStream ois = null;
HashMap<String, User> box = null;
try {
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
try {
box = (HashMap<String, User>)ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fis!=null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(ois!=null)
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return box;
}
private void updateFile(HashMap<String,User> userMsg){
File file = new File(userFilePath);
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(userMsg);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fos!=null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(oos!=null)
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
service层:
public class ATMService {
ATMDao dao = new ATMDao();
public boolean login(String username,String password){
User user = dao.selectUser(username);
if (user!=null && user.getPassword().equals(password))
return true;
else
return false;
}
//查询余额
public Double queryBalance(String name){
User user = dao.selectUser(name);
return user.getBalance();
}
//存款
public void deposit(String name,Double account){
User user = dao.selectUser(name);
user.setBalance(user.getBalance()+account);
dao.updateUser(user);
}
//取款
public void withdrawal(String name,Double account){
User user = dao.selectUser(name);
if (user.getBalance()>=account) {
user.setBalance(user.getBalance() - account);
dao.updateUser(user);
}else {
System.err.println("对不起,"+user.getUsername()+",您的余额不足");
}
}
//转账
public void transfer(String oldName,String newName,Double account){
User oldUser = dao.selectUser(oldName);
User newUser = dao.selectUser(newName);
if (newUser!=null){
if (oldUser.getBalance()>=account){
oldUser.setBalance(oldUser.getBalance()-account);
newUser.setBalance(newUser.getBalance()+account);
dao.updateUser(oldUser);
dao.updateUser(newUser);
}else {
System.err.println("对不起,"+oldUser.getUsername()+",您的余额不足");
}
}else {
System.err.println("对不起,您输入的账号不存在");
}
}
//销户
public void closeAccount(String name){
User u = dao.selectUser(name);
dao.deleteUser(u);
}
//注册
public void register(String name,String password){
User user = dao.selectUser(name);
if (user!=null){
System.err.println("对不起,您输入的账号已存在");
}else {
user = new User(name,password,0.0);
dao.addUser(user);
}
}
}
测试:
public class Test {
public static void main(String[] args) {
ATMService service = new ATMService();
Scanner input = new Scanner(System.in);
System.out.println("欢迎您使用银行自助服务系统\n请输入您的账号:");
String username = input.nextLine();
System.out.println("请输入您的密码:");
String password = input.nextLine();
if (service.login(username,password)){
System.out.println("登录成功!");
while(true) {
System.out.println("请选择您的操作:\n0.注册\n1.查询余额\n2.存款\n3.取款\n4.转账\n5.销户\n6.退出");
String option = input.nextLine();
switch (option) {
case "0":
System.out.println("请输入您的用户名:");
String newname = input.nextLine();
System.out.println("请输入您的密码:");
String newPass = input.nextLine();
service.register(newname, newPass);
System.out.println("恭喜您,注册成功!,您的用户名为" + newname);
break;
case "1":
Double balance = service.queryBalance(username);
System.out.println("您的余额为" + balance);
break;
case "2":
System.out.println("请输入存款金额:");
double amount = input.nextDouble();
input.nextLine();
service.deposit(username, amount);
System.out.println("恭喜您,存款成功");
break;
case "3":
System.out.println("请输入取款金额:");
double d = input.nextDouble();
input.nextLine();
service.withdrawal(username, d);
System.out.println("恭喜您,取款成功");
break;
case "4":
System.out.println("请输入对方账户:");
String anothername = input.nextLine();
System.out.println("请输入转账金额:");
double t = input.nextDouble();
input.nextLine();
service.transfer(username, anothername, t);
System.out.println("恭喜您,转账成功");
break;
case "5":
service.closeAccount(username);
System.out.println("销户成功");
break;
case "6":
System.exit(0);
}
}
}else {
System.err.println("用户名或密码错误");
}
//dao.initFile();
/*HashMap<String, User> userMsg = dao.getUserMsg();
Iterator<String> iterator = userMsg.keySet().iterator();
while (iterator.hasNext()){
String username = iterator.next();
User user = userMsg.get(username);
System.out.println(user);
}*/
}
}
部分测试截图
来源:https://blog.csdn.net/qq_43598138/article/details/105742105
0
投稿
猜你喜欢
- 在Android中使用SQLite数据库的入门指南,打算分下面几部分与大家一起分享, 1、什么是SQLite 2、Android中使用SQL
- 前言本文的记录如何用CustomPaint、GestureDetector实现一个进度条控件。首先需要说明的是 flutter Materi
- 被kafka-client和springkafka版本坑上周刚刚欢天喜地的在linux上部了kafka,这周打算用spring-boot框架
- 最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。一、验证码生成类生成验证码的话需要用到java的Graphics类库,
- 一、简介ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的
- 做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用
- 1 StringString:字符串常量,字符串长度不可变。2 StringBufferStringBuffer:字符串变量(Synchro
- tcp客户端示例#include <errno.h> #include <sys/socket.h> #includ
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- 1、mybatis-plus @DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.data
- 通过本篇文章主要给大家讲解了在JAVA开发中Servlet3.0异步处理遇到的问题以及处理办法,以下是具体内容:Servlet 3.0 开始
- 随着目前微信越来越火,所以研究微信的人也就越来越多,这不前一段时间,我们公司就让我做一个微信公众号中问卷调查发红包功能,经过一段时间的研究,
- 概述日常工作中,我们经常会有发送 HTTP 网络请求的需求,概括下我们常见的发送 HTTP 请求的需求内容:可以发送基本的 GET/POST
- 系列文章已完成,目录如下:jdk-logging log4j logback日志系统实现机制原理介绍commons-lo
- 最近有小伙伴问我,双枚举类该怎么写,还得包括根据key取值方法。于是就手写一个案例如下:/** * 关系类型枚举 */public enum
- 前言我们在学习Windows应用程序开发中,经常会用到消息对话框给用户或者管理员一些的消息提示,它们都是基于对MessageBox类的消息对
- pom.xml配置<dependency> <groupId>org.springframework.
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- 这节主要完成一些基本的增删改查以及Service、Dao和Action的抽取。1. Service层的抽取  
- 一 :问题背景问题:当查询接口较复杂时候,数据的获取都需要[远程调用],必然需要花费更多的时间。 假如查询文章详情页面,需要如下标注的时间才