如何将Java用户注册程序的用户数据存储到TXT文件?
将用户数据持久化到TXT文件的实现方案
现有代码
Main.java
package face; import java.util.Scanner; public class Main { public static void main (String[]args) throws Exception { Scanner sc=new Scanner(System.in); int choice; SignUp m = new SignUp(); while (true) { System.out. println("1)Customer Sign-up\n2)Customer signin\n3)Stop Program"); choice = sc.nextInt(); switch (choice) { case 1: m.customerSignUp(); break; case 2: m.customerSignin(); break; case 3: m.saveUsersToTxt(); // 程序退出前保存数据 System.exit(0); } } } }
SignUp.java
package face; import java.io.Serializable; import java.util.ArrayList; import java.util.Scanner; public class SignUp implements Serializable { Scanner sc = new Scanner(System.in); ArrayList<User> customer = new ArrayList<User>(); Home home = new Home(); // 初始化时加载已保存的用户数据 public SignUp() { loadUsersFromTxt(); } void customerSignUp() { System.out.println("Enter the details to sign-up"); System.out.println("Enter the id"); int id = sc.nextInt(); System.out.println("enter the name"); String name = sc.next(); System.out.println("enter the pass"); String pass = sc.next(); System.out.println("Enter the age"); int age = sc.nextInt(); System.out.println("Enter the gender"); String gender = sc.next(); int d = 0; if (customer.size() > 1) { for (User c : customer) { if (c.id == (id)) { d++; } } } if (d== 0) { customer.add(new User(id, name, pass, age, gender)); saveUsersToTxt(); // 注册后保存数据 System.out.println("Back to home page"); } else { System.out.println("User id already exist"); } } void customerSignin() { System.out.println("Enter id: "); int id = sc.nextInt(); System.out.println("password to Login:"); String pass = sc.next(); int f = 0; User currcustomer = null; for (User c : customer) { if (c.id == (id) && c.password.equals(pass)) { currcustomer = c; f++; break; } } if (f == 0) { System.out.println("Invalid Login or Password"); } else { System.out.println("Logined Successfully...\nWelcome " + currcustomer.name + "\nage " + currcustomer.age + "\ngender " + currcustomer.gender); home.enterHome(currcustomer); } } public void view() { System.out.println("Enter the user name"); String name = sc.next(); for (User c : customer) { if (name.equals(c.name)) { System.out.println("you found the user" + c.name + "\nage " + c.age + "\ngender " + c.gender); break; } else { System.out.println("user name not found"); } } } public void viewAll(User user) { if (customer.size() > 1) { for (User c : customer) { if (c.id != user.id) System.out.println("User: " + c.name + "\nId: " + c.id + "\nage " + c.age + "\ngender " + c.gender); } System.out.println("Do you like to raise a friend request to an account? \n1.Yes 2.No"); int yes = sc.nextInt(); if (yes == 1) { System.out.println("Enter the account Id to whom you want to raise request:"); int requesterId = sc.nextInt(); raiseRequest(requesterId, user); } } else { System.out.println("There are no users yet other than u"); } } public void viewParticularAccount(User user, int targetId) { User targetUser = null; for (User c : customer) { if (c.id != user.id && c.id == targetId) { System.out.println("You are visiting: " + c.name + "\nage " + c.age + "\ngender " + c.gender); targetUser = c; } } if (targetUser != null) { System.out.println("Do you like to raise a friend request to an account? \n1.Yes 2.No"); int yes = sc.nextInt(); if (yes == 1) { System.out.println("Enter the account Id to whom you want to raise request:"); int requesterId = sc.nextInt(); raiseRequest(requesterId, user); } if (yes == 2) { System.out.println("Do you like to check the mutual friends list of this account? \n1.Yes 2.No"); int showMutualview = sc.nextInt(); if (showMutualview == 1) { showMutualFriends(user, targetUser); } } } else { System.out.println("There are no users with the given Id :-) "); } } public void raiseRequest(int requesterId, User user) { for (User c : customer) { if (c.id == requesterId) { c.requesters.add(user); } } } public void showMutualFriends(User user, User targetUser) { for (User u : customer) { if (user.friends.contains(u) && targetUser.friends.contains(u)) { System.out.println("User : " + u.name + "\nage " + u.age + "\ngender " + u.gender); } } } // 新增:将用户数据写入TXT文件(明文格式) public void saveUsersToTxt() { try (java.io.BufferedWriter writer = new java.io.BufferedWriter(new java.io.FileWriter("users.txt"))) { for (User user : customer) { // 用逗号分隔字段,若输入含逗号需转义,此处假设输入无逗号 String line = user.id + "," + user.name + "," + user.password + "," + user.age + "," + user.gender; writer.write(line); writer.newLine(); } } catch (java.io.IOException e) { System.out.println("保存用户数据失败:" + e.getMessage()); } } // 新增:从TXT文件加载用户数据 public void loadUsersFromTxt() { java.io.File file = new java.io.File("users.txt"); if (!file.exists()) { return; // 文件不存在则跳过加载 } try (java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.FileReader(file))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(","); if (parts.length == 5) { int id = Integer.parseInt(parts[0]); String name = parts[1]; String pass = parts[2]; int age = Integer.parseInt(parts[3]); String gender = parts[4]; customer.add(new User(id, name, pass, age, gender)); } } } catch (java.io.IOException | NumberFormatException e) { System.out.println("加载用户数据失败:" + e.getMessage()); } } }
补充User类(需实现Serializable)
package face; import java.io.Serializable; import java.util.ArrayList; public class User implements Serializable { public int id; public String name; public String password; public int age; public String gender; public ArrayList<User> friends = new ArrayList<>(); public ArrayList<User> requesters = new ArrayList<>(); public User(int id, String name, String password, int age, String gender) { this.id = id; this.name = name; this.password = password; this.age = age; this.gender = gender; } }
实现说明
- 明文存储逻辑:每个用户数据占一行,字段用逗号分隔,可直接用文本编辑器查看和修改。若用户输入可能包含逗号,需对字段做转义处理(比如用双引号包裹字段)。
- 自动持久化时机:在
SignUp构造方法中加载历史数据,确保程序启动时恢复之前的用户列表;用户注册成功后、程序退出前调用保存方法,保证数据不会丢失。 - 资源安全:使用
try-with-resources语法,自动关闭文件流,避免资源泄漏。 - 异常处理:捕获文件IO和格式转换异常,输出错误提示,防止程序崩溃。
可选:二进制序列化存储方案
若不需要可读的TXT格式,可采用二进制序列化方式直接保存整个用户列表对象,代码如下:
// 序列化保存用户数据 public void saveUsersToFile() { try (java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(new java.io.FileOutputStream("users.dat"))) { oos.writeObject(customer); } catch (java.io.IOException e) { System.out.println("保存用户数据失败:" + e.getMessage()); } } // 反序列化加载用户数据 @SuppressWarnings("unchecked") public void loadUsersFromFile() { java.io.File file = new java.io.File("users.dat"); if (!file.exists()) { return; } try (java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.FileInputStream(file))) { customer = (ArrayList<User>) ois.readObject(); } catch (java.io.IOException | ClassNotFoundException e) { System.out.println("加载用户数据失败:" + e.getMessage()); } }
此方案无需手动处理字段拼接,但生成的文件为二进制格式,无法直接编辑查看。
内容的提问来源于stack exchange,提问作者Edhaya Murali
相关产品推荐
相关产品推荐

