GDPU Java 天码行空11 IO应用

(一)实验目的

1、掌握JAVA中IO中各种类及其构造方法;
2、重点掌握IO中类所具有的IO操作方法;
3、熟悉软件中登录模块的开发方法;
4、掌握IO中读写常用方法。
5、进一步熟悉正则规则的使用方法。

(二)实验内容和步骤

1、游戏中有一个用户注册与登录模块,用于用户注册和登录。请编写一个用户注册和登录程序,通过选择注册、登录和退出进入相应处理。当选择注册时,新用户可以输入用户名和密码,显示该用户在xxxx年xx月xx日xx时xx分注册成功,并将用户名和密码保存到文件中,选择登录时,通过比对用户输入的用户各和密码是否与已经保存的文件中的用户名和密码提示用户登录成功或失败,当失败时,提示用户重新输入,并提示剩余的可输入次数,登录输入有三次机会,三次输入均错误则锁定账户并提示用户与管理员联系。选择退出时程序退出。(进阶:如能完成上述功能,可以增加下述功能:增加一个验证码,验证码为随机生成的1-100的数字;用户名必须为字母,密码可以是字母也可以是数字,长度必须在6-22位之间;在注册时,要求用户输入两次密码,并对两次输入的密码进行比对,两次相同时通过,不同时提示两次密码输入不一致,请重新输入。)

💖 UserAuthentication.java

import java.io.*;
import java.nio.file.*;
import java.time.*;
import java.util.Scanner;

public class UserAuthentication {
    private static final String USER_FILE = "users.txt";
    private static final int MAX_ATTEMPTS = 3;

    public static void main(String[] args) {
        ensureUserFileExists();

        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请选择操作:");
            System.out.println("1. 注册");
            System.out.println("2. 登录");
            System.out.println("3. 退出");
            System.out.print("请输入你的选择(1/2/3): ");
            int choice = scanner.nextInt();

            switch (choice) {
                case 1:
                    registerUser(scanner);
                    break;
                case 2:
                    loginUser(scanner);
                    break;
                case 3:
                    System.out.println("程序退出。");
                    scanner.close();
                    System.exit(0);
                default:
                    System.out.println("无效的选择,请重新输入。");
            }
        }
    }

    private static void ensureUserFileExists() {
        Path path = Paths.get(USER_FILE);
        if (!Files.exists(path)) {
            try {
                Files.createFile(path);
            } catch (IOException e) {
                System.out.println("创建用户文件失败。");
                e.printStackTrace();
            }
        }
    }

    private static void registerUser(Scanner scanner) {
        System.out.print("请输入用户名: ");
        String username = scanner.next();
        if (!username.matches("[a-zA-Z]+")) {
            System.out.println("用户名必须为字母。");
            return;
        }

        System.out.print("请输入密码: ");
        String password1 = scanner.next();
        System.out.print("请再次输入密码: ");
        String password2 = scanner.next();

        if (!password1.equals(password2)) {
            System.out.println("两次密码输入不一致,请重新输入。");
            return;
        }

        if (password1.length() < 6 || password1.length() > 22) {
            System.out.println("密码长度必须在6-22位之间。");
            return;
        }

        // 检查用户名是否已存在
        if (isUsernameExists(username)) {
            System.out.println("用户名已存在,请选择其他用户名。");
            return;
        }

        // 写入用户信息到文件
        writeUserInfoToFile(username, password1, LocalDateTime.now());
        System.out.println("注册成功,用户名: " + username + " 在 " + LocalDateTime.now() + " 注册成功。");
    }

    private static boolean isUsernameExists(String username) {
        try (BufferedReader reader = Files.newBufferedReader(Paths.get(USER_FILE))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                if (parts.length > 0 && username.equals(parts[0])) {
                    return true;
                }
            }
        } catch (IOException e) {
            System.out.println("读取用户文件失败。");
            e.printStackTrace();
        }
        return false;
    }

    private static void writeUserInfoToFile(String username, String password, LocalDateTime registrationTime) {
        String userInfo = username + "," + password + "," + registrationTime + "\n";
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(USER_FILE), StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
            writer.write(userInfo);
        } catch (IOException e) {
            System.out.println("写入用户信息失败。");
            e.printStackTrace();
        }
    }

    private static void loginUser(Scanner scanner) {
        System.out.print("请输入用户名: ");
        String username = scanner.next();
        System.out.print("请输入密码: ");
        String password = scanner.next();

        if (verifyUser(username, password)) {
            System.out.println("登录成功。");
        } else {
            System.out.println("用户名或密码错误,登录失败。");
        }
    }

    private static boolean verifyUser(String username, String password) {
        try (BufferedReader reader = Files.newBufferedReader(Paths.get(USER_FILE))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                if (parts.length > 1 && username.equals(parts[0]) && password.equals(parts[1])) {
                    return true;
                }
            }
        } catch (IOException e) {
            System.out.println("读取用户文件失败。");
            e.printStackTrace();
        }
        return false;
    }
}

⭐ 运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值