拥有登录、身份验证、注册、存钱、取钱查询余额、查询记录的功能。

每次的程序结束都会重写个人信息文件。将客户的操作写入文件中。下次运行程序会读取文件,进行身份验证和相关的属性初始化。

1、用于保存个人信息。

package ATM;

import java.io.Serializable;

//个人信息
public class database implements Serializable {
    private String account;//账户
    private String password;//密码
    private long balance;//余额
    String []s=new String[10];//记录操做


    public database() {
    }

    public database(String account, String password, long balance) {
        this.account = account;
        this.password=password;
        this.balance = balance;
    }

    public void setRecording(String R){//记录每一次的操作。以便于查询。从数组最后开始写入(保存10条信息)

        if (s.length>=10){
        for (int x=0;x<9;x++){

            s[x]=s[x+1];
            s[x+1]=R;
        }
        }
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public long getBalance() {
        return balance;
    }

    public void setBalance(long balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "database{" +
                "账户名='" + account + '\'' +
                ", 余额=" + balance +
                '}';
    }



    public void print(){//输出保存的历史记录。(把数组遍历一遍)
        for (String s:s){
            System.out.println(s);
        }
    }
}

2、对ATM机业务的实现。(存取钱等)

package ATM;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

//业务
public class business {
    //获取当前时间便于查询记录
    LocalDateTime dateTime = LocalDateTime.now(); //dd-MM-yyyy
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//时间表示年月日时分秒
    String date= dateTime.format(formatter);

    Scanner input = new Scanner(System.in);


//查询余额
    public void Inquire(database database){
        System.out.println("余额:"+database.getBalance());
        database.setRecording( "查询余额、"+"时间:"+date+"。");//将操作记录放到个人信息类中、

    }




    //存钱
    public void Saving(database database) {
        System.out.println("输入存钱的数目");
        long l = input.nextInt();
        if (l >= 0) {
            database.setBalance(l + database.getBalance());
            System.out.println("操作成功");
            database.setRecording( "存钱、"+"时间:"+date+"。");//将操作记录放到个人信息类中、
        }else {
            System.out.println("钱不能为负数");
            database.setRecording( "存钱、"+"时间:"+date+"。");//将操作记录放到个人信息类中、
        }
    }




    //取钱
    public void take(database database){
        System.out.println("输入要取钱的数目");

        long l = input.nextInt();
        if (l >= 0 && database.getBalance()-l>=0) {
            database.setBalance(database.getBalance()-l);
            System.out.println("操作成功");
            database.setRecording( "取钱、"+"时间:"+date+"。");//将操作记录放到个人信息类中、
        }else {
            System.out.println("余额不足");
            database.setRecording( "取钱、"+"时间:"+date+"。");//将操作记录放到个人信息类中、
        }
    }
    //查询操作记录
   public void history(database database){//查询操作只需遍历database类中的s数组(保存操作记录的)
        database.print();
   }



}

3、登录,注册,身份验证。

package ATM;

import java.io.*;
import java.util.Scanner;

//登录
public class login {
environment environment=new environment();//实例化配置类
//登录

    public void login1(){
        Scanner input = new Scanner(System.in);
        System.out.println("输入账户名");
        String account = input.next();
        System.out.println("输入密码(没有规律的6位数字)");
        String password =input.next();

        File file=new File(environment.getPath()+account+".atm");//在path路径下以客户账户名字命名的文件
        if (file.exists() && file.isFile()){//路径存在且是是文件
            database database= null;

            try {
                //读取对应的客户文件
                InputStream outputStream=new FileInputStream(file);
                ObjectInputStream objectOutputStream=new ObjectInputStream(outputStream);
                database = (database) objectOutputStream.readObject();
                objectOutputStream.close();

            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("用户不存在");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }


            if (password.equals(database.getPassword())){//比较密码是否正确
                while (true){//在第一个操作完成后可以进行选择退出还是其他操作。
                System.out.println("请按对应的操作:1、查询余额。2、存钱。3、取钱。4、查询历史记录.5、退出");
                int l=input.nextInt();
                if (l>0 && l<6){
                    business business=new business();

                    switch (l){
                        case 1:business.Inquire(database);break;
                        case 2:business.Saving(database);break;
                        case 3:business.take(database);break;
                        case 4:business.history(database);break;
                        case 5:return;//按5退出这死循环

                    }
                    try {
                        //将客户的操作存储的对应文件中。方便下次读取。
                        OutputStream outputStream=new FileOutputStream(file);
                        ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
                        objectOutputStream.writeObject(database);
                        objectOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("未知错误请联系管理员");
                    }
                }else {
                    System.out.println("输入错误");
                }}
            }else {
                System.out.println("密码错误");
            }

        }else {
            System.out.println("用户不存在");
        }
    }

//注册

    public void enroll() {

        Scanner input = new Scanner(System.in);
        System.out.println("输入账户名");
        String account = input.next();
        System.out.println("输入密码(没有规律的6位数字)");
        String password =input.next();
        long balance=0;//初始化余额
        File file=new File(environment.getPath()+account+".atm");//在指定路径下以账户命名的文件
       if (account !=null && account.length()<12)//判断账户是否合规
           if (password.length()==6){//判断密码是否合规
               database database=new database(account,password,balance);//将个人信息存入database类中;

               //客户注册时生成对应的文件方便下次读取客户个人信息
               try {
                   OutputStream outputStream=new FileOutputStream(file);
                   ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
                   objectOutputStream.writeObject(database);//将database类序列化
                   objectOutputStream.close();
                   login1();
                   System.out.println("注册成功,请登录");

               } catch (IOException e) {
                   e.printStackTrace();
                   System.out.println("未知错误请联系管理员");
               }

           }
       }
    }

4、配置环境生成相关的文件。(需要更改文件位置的只需更改次类中的path属性)

package ATM;

import java.io.File;

//环境
public class environment {
  private   String path="F:\\ATM\\database\\";

    public void remodel(){
        File file=new File(path);
        if (!file.exists()){
            System.out.println(file.mkdirs());
        }
    }

    public String getPath() {
        return path;
    }
}

5、程序的调用(主方法内的使用)

package ATM;

import java.util.Scanner;

/*
1、登录省份验证
2、每个不同的人登录会有不同的余额
3、进行不同的操作(查询,存钱,取钱)

* */
public class ATM {
    public static void main(String[] args) {
        environment environment=new environment();
        environment.remodel();

        Scanner input=new Scanner(System.in);
        System.out.println("1、已有账号登录 2、没有账户注册");
        int i= 0;
        try {//这里的异常是防止输出的数据类型不是int
            i = input.nextInt();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (i>0 && i<3) {
            login login=new login();
            try {
                switch (i) {
                    case 1:
                        login.login1();break;//调用登录
                    case 2:
                        login.enroll();break;//调用注册
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("未知错误");
            }


        }else {
            System.out.println("输入错误,请检查。同时联系管理员");
        }