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








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();
//设计一个方法 目的是为了我的所有业务服务
//有参数 账号名 返回值 一个对象User
public 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);
}
}
}
