(一)实验目的
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;
}
}