Java基于對(duì)象流實(shí)現(xiàn)銀行系統(tǒng)
Java基于對(duì)象流實(shí)現(xiàn)銀行系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
系統(tǒng)特點(diǎn):
- 數(shù)據(jù)持久化到文件中,系統(tǒng)啟動(dòng)后,加載文件中數(shù)據(jù)到集合中,相當(dāng)于做了一個(gè)緩存。
- 文件讀寫使用的是對(duì)象流(ObjectInputStream和ObjectOutputStream),用戶是看不懂那些文件的,一定程度上保證了密碼和余額的安全性。
- 采用了MVC分層設(shè)計(jì)思想,雖然沒有C控制層和V視圖層,但是有完備的M模型層,數(shù)據(jù)處理Service,數(shù)據(jù)讀寫Dao,數(shù)據(jù)存儲(chǔ)POJO(每一層只負(fù)責(zé)處理自己的事情,層次內(nèi)部的改動(dòng)不會(huì)影響其他層次)。
- 雖然有些細(xì)節(jié)問題由于時(shí)間關(guān)系沒有處理好,比如沒有處理輸入類型不匹配的異常,但是絕大多數(shù)功能都合理得實(shí)現(xiàn)了。
全部代碼
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";//相對(duì)路徑 ? ? 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); ? ? } ? ? //只在初始化時(shí)時(shí)調(diào)用一次 /* ? ?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("對(duì)不起,"+user.getUsername()+",您的余額不足"); ? ? ? ? } ? ? } ? ? //轉(zhuǎn)賬 ? ? 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("對(duì)不起,"+oldUser.getUsername()+",您的余額不足"); ? ? ? ? ? ? } ? ? ? ? }else { ? ? ? ? ? ? System.err.println("對(duì)不起,您輸入的賬號(hào)不存在"); ? ? ? ? } ? ? } ? ? //銷戶 ? ? public void closeAccount(String name){ ? ? ? ? User u = dao.selectUser(name); ? ? ? ? dao.deleteUser(u); ? ? } ? ? //注冊(cè) ? ? public void register(String name,String password){ ? ? ? ? User user = dao.selectUser(name); ? ? ? ? if (user!=null){ ? ? ? ? ? ? System.err.println("對(duì)不起,您輸入的賬號(hào)已存在"); ? ? ? ? }else { ? ? ? ? ? ? user = new User(name,password,0.0); ? ? ? ? ? ? dao.addUser(user); ? ? ? ? } ? ? } }
測(cè)試:
public class Test { ? ? public static void main(String[] args) { ? ? ? ? ATMService service = new ATMService(); ? ? ? ? Scanner input = new Scanner(System.in); ? ? ? ? System.out.println("歡迎您使用銀行自助服務(wù)系統(tǒng)\n請(qǐng)輸入您的賬號(hào):"); ? ? ? ? String username = input.nextLine(); ? ? ? ? System.out.println("請(qǐng)輸入您的密碼:"); ? ? ? ? String password = input.nextLine(); ? ? ? ? if (service.login(username,password)){ ? ? ? ? ? ? System.out.println("登錄成功!"); ? ? ? ? ? ? while(true) { ? ? ? ? ? ? ? ? System.out.println("請(qǐng)選擇您的操作:\n0.注冊(cè)\n1.查詢余額\n2.存款\n3.取款\n4.轉(zhuǎn)賬\n5.銷戶\n6.退出"); ? ? ? ? ? ? ? ? String option = input.nextLine(); ? ? ? ? ? ? ? ? switch (option) { ? ? ? ? ? ? ? ? ? ? case "0": ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入您的用戶名:"); ? ? ? ? ? ? ? ? ? ? ? ? String newname = input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入您的密碼:"); ? ? ? ? ? ? ? ? ? ? ? ? String newPass = input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? service.register(newname, newPass); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("恭喜您,注冊(cè)成功!,您的用戶名為" + newname); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "1": ? ? ? ? ? ? ? ? ? ? ? ? Double balance = service.queryBalance(username); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("您的余額為" + balance); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "2": ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入存款金額:"); ? ? ? ? ? ? ? ? ? ? ? ? double amount = input.nextDouble(); ? ? ? ? ? ? ? ? ? ? ? ? input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? service.deposit(username, amount); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("恭喜您,存款成功"); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "3": ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入取款金額:"); ? ? ? ? ? ? ? ? ? ? ? ? double d = input.nextDouble(); ? ? ? ? ? ? ? ? ? ? ? ? input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? service.withdrawal(username, d); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("恭喜您,取款成功"); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "4": ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入對(duì)方賬戶:"); ? ? ? ? ? ? ? ? ? ? ? ? String anothername = input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入轉(zhuǎn)賬金額:"); ? ? ? ? ? ? ? ? ? ? ? ? double t = input.nextDouble(); ? ? ? ? ? ? ? ? ? ? ? ? input.nextLine(); ? ? ? ? ? ? ? ? ? ? ? ? service.transfer(username, anothername, t); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("恭喜您,轉(zhuǎn)賬成功"); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "5": ? ? ? ? ? ? ? ? ? ? ? ? service.closeAccount(username); ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("銷戶成功"); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case "6": ? ? ? ? ? ? ? ? ? ? ? ? System.exit(0); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }else { ? ? ? ? ? ? System.err.println("用戶名或密碼錯(cuò)誤"); ? ? ? ? } ? ? ? ? //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); ? ? ? ? }*/ ? ? } }
部分測(cè)試截圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫(kù)功能示例
這篇文章主要介紹了Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫(kù)功能,較為詳細(xì)的分析了事務(wù)操作的原理、實(shí)現(xiàn)方法及java基于jdbc連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)銀行事務(wù)操作的相關(guān)技巧,需要的朋友可以參考下2017-12-12Java Fluent Mybatis 項(xiàng)目工程化與常規(guī)操作詳解流程篇 上
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis2021-10-10SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種)
這篇文章主要介紹了SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02SpringBoot項(xiàng)目在啟動(dòng)后自動(dòng)關(guān)閉的實(shí)現(xiàn)
我們?cè)趯憇pring?boot?web項(xiàng)目時(shí),有時(shí)會(huì)遇到啟動(dòng)后立即關(guān)閉的情況,?本文主要介紹了SpringBoot項(xiàng)目在啟動(dòng)后自動(dòng)關(guān)閉的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01logback和log4j日志框架堆棧信息添加TraceId方式
這篇文章主要介紹了logback和log4j日志框架堆棧信息添加TraceId方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Java進(jìn)行反編譯生成.java文件方式(javap、jad下載安裝使用)
這篇文章主要介紹了Java進(jìn)行反編譯生成.java文件方式(javap、jad下載安裝使用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12如何使用JDBC連接數(shù)據(jù)庫(kù)并執(zhí)行SQL語(yǔ)句
JDBC是Java數(shù)據(jù)庫(kù)連接的縮寫,是Java程序與數(shù)據(jù)庫(kù)進(jìn)行交互的標(biāo)準(zhǔn)API。JDBC主要包括Java.sql和javax.sql兩個(gè)包,通過DriverManager獲取數(shù)據(jù)庫(kù)連接對(duì)象Connection,并通過Statement或PreparedStatement執(zhí)行SQL語(yǔ)句2023-04-04Java中的靜態(tài)綁定和動(dòng)態(tài)綁定詳細(xì)介紹
這篇文章主要介紹了Java中的靜態(tài)綁定和動(dòng)態(tài)綁定詳細(xì)介紹,在Java中存在兩種綁定方式,一種為靜態(tài)綁定,又稱作早期綁定,另一種就是動(dòng)態(tài)綁定,亦稱為后期綁定,需要的朋友可以參考下2015-01-01Java實(shí)現(xiàn)監(jiān)控多個(gè)線程狀態(tài)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狫ava實(shí)現(xiàn)監(jiān)控多個(gè)線程狀態(tài)的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Java多線程 兩階段終止模式Two-Phase Termination Patter
這篇文章主要介紹了Java多線程 兩階段終止模式Two-Phase Termination Patter,該模式有兩個(gè)角色,分別是Terminator,終止者,負(fù)責(zé)接收終止請(qǐng)求,執(zhí)行終止處理,處理完成后再終止自己。TerminationRequester終止請(qǐng)求發(fā)出者,用來向Terminator發(fā)出終止請(qǐng)求,需要的朋友可以參考一下2021-10-10