编辑代码

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;


class Sing_supure {   //定义Sing_supure类

    public static boolean sign() {  //定义公共静态方法sign(),返回类型为boolean
        String name = "root";  //声明字符串变量name并初始化为“root”,表示账号名
        String password = "root";  //声明字符串变量password并初始化为“root”,表示密码
        int a = 3;  //声明整型变量a并初始化为3,表示最多可以输错密码的次数
        for (int i = 0; i < 3; i++) {  //进入for循环,循环条件为i < 3,即最多可以尝试输入密码3次
            System.out.println("请输入账号:");  //打印输出“请输入账号:”
            Scanner sc = new Scanner(System.in);  //创建Scanner对象sc,用于从键盘读取输入的账号信息
            String s1 = sc.next();  //通过调用Scanner对象的next()方法获取用户输入的账号信息,并将其赋值给字符串变量s1
            System.out.println("请输入密码:");  //打印输出“请输入密码:”
            Scanner s = new Scanner(System.in);  //创建Scanner对象s,用于从键盘读取输入的密码信息
            String s2 = s.next();  //通过调用Scanner对象的next()方法获取用户输入的密码信息,并将其赋值给字符串变量s2
            if (s1.equals(name) && s2.equals(password)) {  //如果s1和password都等于“root”,则打印输出“又被你蒙对了密码”,并返回true
                System.out.println("又被你蒙对了密码");
                return true;
            }
            if (a == 0) {  //如果已经输错了3次密码,则打印输出“瞎蒙还想登陆?gun”,并退出循环
                System.out.println("瞎蒙还想登陆?gun");
                break;
            }
            System.out.println("哪个小孩在瞎蒙我密码");  //否则打印输出“哪个小孩在瞎蒙我密码”
        }
        return false;  //for循环结束,返回false
    }
}

class Ticket {
    String name;//声明字符串类型变量name,表示姓名
    String idCard;//声明字符串类型变量idCard,表示身份证号
    String time;//声明字符串类型变量time,表示时间
    String ticketType;//声明字符串类型变量ticketType,表示门票类型

    public Ticket(String name, String idCard, String time, String ticketType) { //定义构造方法Ticket,参数为name、idCard、time、ticketType
        this.name = name; //将传入的name值赋给成员变量name
        this.idCard = idCard; //将传入的idCard值赋给成员变量idCard
        this.time = time; //将传入的time值赋给成员变量time
        this.ticketType = ticketType; //将传入的ticketType值赋给成员变量ticketType
    }
}

class TicketOrder {

    //声明静态ArrayList类型变量ticketsList,存储门票信息
    static ArrayList<Ticket> ticketsList = new ArrayList<Ticket>();

    //定义常量数组TICKET_TYPES,表示不同门票类型
    static final String[] TICKET_TYPES = {"儿童票", "成人票", "老年票"};

    public static void main(String[] args) throws Exception {
        System.out.println("--------欢迎来到游乐园售票系统--------");

        boolean flag = true;  //用于控制程序运行的标志变量
        Scanner scan = new Scanner(System.in);  //创建Scanner对象scan,用于从键盘读取输入的信息

        while (flag) {  //进入while循环,根据用户选择执行相应的操作
            System.out.println("1.购买游乐园门票");
            System.out.println("2.管理员登陆");
            int a = scan.nextInt();  //通过调用Scanner对象的nextInt()方法获取用户输入的选项,并将其赋值给a变量

            if (a == 1) {  //购买门票
                System.out.println("请输入姓名:");
                String name = scan.next();  //通过调用Scanner对象的next()方法获取用户输入的姓名,并将其赋值给name变量

                System.out.println("请输入身份证号:");
                String idCard = scan.next();  //通过调用Scanner对象的next()方法获取用户输入的身份证信息,并将其赋值给idCard变量

                System.out.println("请选择门票类型:1-儿童票 2-成人票 3-老年票");
                int typeIndex = scan.nextInt() - 1;  //通过调用Scanner对象的nextInt()方法获取用户选择的门票类型,并将其赋值给typeIndex变量

                if (typeIndex >= 0 && typeIndex < TICKET_TYPES.length) {  //判断用户输入是否合法
                    String ticketType = TICKET_TYPES[typeIndex];  //根据用户选择的门票类型,从常量数组TICKET_TYPES中获取相应的门票类型
                    String time = getCurrentTime();  //获取当前时间
                    Ticket ticket = addTicket(name, idCard, time, ticketType);  //创建Ticket对象,参数为name、idCard、time、ticketType,并将其添加到ArrayList中
                    FileUtil.saveTickets(ticket);  //将购票信息写入文件
                } else {
                    System.out.println("输入有误,请重新购买!");  //如果用户输入不合法,提示用户重新购买
                }
            } else if (a == 2) {  //管理员登录
                if (Sing_supure.sign()) {  //如果管理员账号和密码正确,则进入二级菜单
                    while (true) {  //进入while循环,根据用户选择执行相应的操作
                        System.out.println("1查看订单 2退出登陆");
                        int number = scan.nextInt();  //通过调用Scanner对象的nextInt()方法获取用户输入的选项,并将其赋值给number变量

                        if (number == 1) {  //查看订单
                            FileUtil.readTickets();  //从文件中读取门票信息并打印出来
                        } else {
                            break;  //退出菜单,返回一级菜单
                        }
                    }
                }
            } else {
                System.out.println("输入错误");  //如果用户输入不合法,提示用户重新输入
            }
        }
    }


     // 获取当前时间
    private static String getCurrentTime() {
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(date);
    }

    //定义addTicket方法,参数为name、idCard、time、ticketType,表示添加门票信息
    public static Ticket addTicket(String name, String idCard, String time, String ticketType) {
        Ticket ticket = new Ticket(name, idCard, time, ticketType);  //创建Ticket对象,参数为name、idCard、time、ticketType
        ticketsList.add(ticket);  //将门票信息添加到ArrayList中
        return ticket;
    }
}

class FileUtil {

    // 票务信息文件路径
    public static final String TICKET_FILE_PATH = "售票订单.txt";
    public static final String SEPARATE_FIELD = "\n";// 换行
    public static final String SEPARATE_LINE = "\t"; // 分隔



    // 保存门票信息

    public static synchronized void saveTickets(Ticket ticket) {
        // 首先检查今天是否已售出500张票
        if (isTicketFull()) {  // 调用isTicketFull()方法判断今天是否已售出500张票
            System.out.println("今天的门票已经售完了,请明天再来");
            return;
        }

        // 判断本地是否存在此文件
        File file = new File(TICKET_FILE_PATH);  // 根据文件路径创建File对象
        if (!file.exists()) {  // 如果该文件不存在,则创建新文件并写入门票信息
            createFile(TICKET_FILE_PATH, false, ticket);
        } else {  // 如果该文件存在,则在文件末尾追加门票信息
            createFile(TICKET_FILE_PATH, true, ticket);
        }
    }

    /**
     * 将门票信息保存到本地,可通过label标识来判断是修改文件还是新建文件
     *
     * @param name   文件名
     * @param label  文件已存在的标识 true:已存在则修改; false:不存在则新建
     * @param ticket 门票信息
     */
    public static void createFile(String name, boolean label, Ticket ticket) {
        BufferedOutputStream out = null;
        StringBuffer sbf = new StringBuffer();// 拼接内容
        try {
            if (label) {// 当已存在当天的文件,则在文件内容后追加
                // 创建输出流,用于追加文件
                out = new BufferedOutputStream(new FileOutputStream(name, true));
            } else {// 不存在当天文件,则新建文件
                // 创建输出流,用于保存文件
                out = new BufferedOutputStream(new FileOutputStream(name));
                String fieldSort = "游乐园现场售票系统";// 创建表头
                // 新建时,将表头存入本地文件
                sbf.append(fieldSort).append(SEPARATE_FIELD);
            }
            sbf.append("购买时间:").append(ticket.time).append(SEPARATE_LINE);
            sbf.append("姓名:").append(ticket.name).append(SEPARATE_LINE);
            sbf.append("身份证号:").append(ticket.idCard).append(SEPARATE_LINE);
            sbf.append("门票类型:").append(ticket.ticketType).append(SEPARATE_FIELD);

            String str = sbf.toString();
            byte[] b = str.getBytes();
            out.write(b);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();// 关闭输出流
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    /*
     * 读取门票订单并显示
     */
    public static void readTickets() throws Exception {
        // 创建文件字节输出流
        FileInputStream in = new FileInputStream(TICKET_FILE_PATH);
        byte[] b = new byte[in.available()];
        in.read(b);
        String str = new String(b);
        System.out.println(str);
        in.close();
    }

    /*
     * 判断今天售票数量是否已满500
     */
    private static boolean isTicketFull() {
        boolean isFull = false;
        int soldNum = 0;

        try {
            // 读取售票订单文件,查找文件中购票时间为今天的所有门票记录,并统计总数
            File file = new File(TICKET_FILE_PATH);
            if (file.exists()) {
                FileReader fr = new FileReader(file);
                BufferedReader br = new BufferedReader(fr);
                String line = null;

                while ((line = br.readLine()) != null) {
                    if (line.contains(getTodayDate())) {
                        soldNum += 1;
                    }
                }
                br.close();
            }

            if (soldNum >= 500) {
                isFull = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return isFull;
    }


     // 获取当前日期字符串,格式为:yyyy-MM-dd

    private static String getTodayDate() {
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        return format.format(date);
    }
}