ObjectInputStream对ArrayList对象存储(用户注册)

本文介绍了一个简单的Java用户注册系统的实现过程,包括用户信息类的设计、注册信息的序列化存储及读取等功能,并解决了文件输入流参数设置的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想了一天,晚上又整了两个小时,马上就要放弃了,想来又觉着一天的努力可惜了。出去理清了下思路,回来看了下代码,只是把应该把FileInputStream("str",true),写成false

就可以成功了。看来,不论成功大小,都不是那么的遥不可及,有时也就是那么坚持一小下。

package com.jereh.demo.model;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Entity implements Serializable{
	private String username ;
	private String password ;
	int age ;
	Date date ;
	public Entity(){}
	public Entity(String username,String password,int age)
	{
		this.username=username;
		this.password=password;
		this.age=age;
	}
	public int getAge() {
		return age;
	}
	public Date getDate() {
		return date;
	}
	public String getPassword() {
		return password;
	}
	public String getUsername() {
		return username;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setDate(String dateStr) {
		this.date = this.toDate(dateStr);
	}
	public void setDate(Date dateStr) {
		this.date = dateStr;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	/**
	 * 实现对用户输入的注册日期字符串进行转换
	 * @param str
	 * @return
	 */
	private Date toDate(String str)
	{
		DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
		try {
			this.date = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return this.date;
		
	}

}


package com.jereh.demo.model;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class EntityService {
	Entity user =null;
	List<Entity> users = new ArrayList<Entity>();
	public EntityService(){
		//this.user = new Entity("zhang","zhang",12) ;
		this.user = new Entity();
	}
	public List<Entity> getUser() {
		// users.add(user);
		 return users;
	}
	public void setUser(Entity user) {
		this.user = user;
	}
	/**
	 * 返回一个字符串
	 * @return
	 */
	private String getStringInfo()
	{
		Scanner scan = new Scanner(System.in) ;
		return scan.next(); // 返回一个字符串
	}
	private int getInt()
	{
		Scanner scan = new Scanner(System.in) ;
		return scan.nextInt();
	}
	
	public void getUserName()
	{
		System.out.print("请输入用户名:");
		String str = this.getStringInfo();
		user.setUsername(str) ;
	}
	private void getPassword()
	{
		System.out.print("请输入密码:");
		user.setPassword(this.getStringInfo());
	}
	private void getAge() 
	{
		System.out.print("请输入年龄:") ;
		user.setAge(this.getInt());
	}
	private void getRegDate()
	{
		//System.out.print("请输入注册日期:");
		Date date = new Date() ;
		System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date)) ;
		user.setDate(date);
	}
	
	public void serivce()
	{
		getUserName();
		getPassword();
		getAge();
		getRegDate();
		this.registerInfo();
		this.getRegisterInfo();
	}
	 private void registerInfo()
	 {
		 ObjectOutput is = null ;
		 ObjectInput oi = null;
		// 
		 File file = new File("d:\\Reg.txt") ;
		 try {
			 if(file.length()==0)
			 {
			  this.users.add(this.user);
			  System.out.println("*888888") ;
			 is = new ObjectOutputStream(new FileOutputStream(file,true)) ;
			 is.writeObject(this.users);
			 }else
			 {
				 oi = new ObjectInputStream(new FileInputStream(file)) ;
				 ArrayList<Entity> users = null ;
				 Object obj = null ;
				 try {
					 obj = oi.readObject();		
					 users = (ArrayList)obj;
					 users.add(this.user);
					 is = new ObjectOutputStream(new FileOutputStream(file,false)) ;
					 is.writeObject(users);// 重新写入
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			 }			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally
		{
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	 }
	 private void getRegisterInfo()
	 {
		 ObjectInput oi =null; 
		 try {
			oi = new ObjectInputStream(new FileInputStream("d:\\Reg.txt")) ;
			List<Entity> users = null;
			users=(ArrayList<Entity>)(oi.readObject());
			System.out.println(users.size()) ;
			for(Entity oneUser:users)
			{
			 System.out.println("用户名: "+oneUser.getUsername()+"\n"+"用户密码:"+oneUser.getPassword()+"\n"+"年龄:"+oneUser.getAge()+"\n"+"注册日期:"+new SimpleDateFormat("yyyy-MM-dd").format(oneUser.getDate())+"\n") ;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally
		{
			try {
				oi.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		 
	 }

}


package com.jereh.demo.model;

public class TestRegister {
	 EntityService es = new EntityService();
	public static void main(String args[])
	{
		new TestRegister().getReg();
	}
	private void getReg()
	{
		es.serivce();
	}

}



<think>我们设计一个打字训练系统。这个系统需要实现以下基本功能:1.用户注册和登录:保存用户信息,包括用户名、密码等。2.打字练习:提供不同类型的练习(如英文文章、随机字母等),记录用户的输入速度和正确率。3.成绩记录:保存用户的打字成绩(速度、正确率、时间等),并可以查看历史成绩。4.成绩排名:按照打字速度等指标进行排名。考虑到这是一个课程设计,我们采用面向对象的思想,设计以下几个类:-User类:代表用户,包含用户名、密码等属性,以及登录、注册等方法。-TypingExercise类:代表一次打字练习,包含练习内容、用户输入、开始时间、结束时间等,并可以计算打字速度和正确率。-ExerciseManager类:管理练习内容,例如从文件或数据库中获取练习文本。-HistoryRecord类:代表一次历史记录,包含用户、练习内容、速度、正确率、时间等。-HistoryManager类:管理历史记录,包括保存记录、查询用户的历史记录、成绩排名等。由于是控制台程序,我们将使用命令行交互。为了简化,数据存储使用文件(例如:用户信息存储在users.txt,历史记录存储在history.txt)。步骤:1.设计User类,并实现注册和登录功能。2.设计ExerciseManager,从文件中读取练习文本(可以预先准备一些文本)。3.设计TypingExercise类,用于进行打字练习,记录用户输入,计算速度和正确率。4.设计HistoryRecord类和HistoryManager类,用于保存和查询历史记录。下面我们分别实现这些类。注意:由于是示例,我们简化一些细节,比如密码存储不加密(实际中应该加密),错误处理简单等。首先,我们创建User类:</think>### Java面向对象课程设计:打字训练系统解决方案 下面是一个完整的打字训练系统实现方案,包含核心类设计和主要功能代码: ```java import java.io.*; import java.util.*; import java.time.*; // 用户类 class User { private String username; private String password; private List<ScoreRecord> scores = new ArrayList<>(); public User(String username, String password) { this.username = username; this.password = password; } // 登录验证 public boolean authenticate(String password) { return this.password.equals(password); } // 添加成绩记录 public void addScoreRecord(ScoreRecord record) { scores.add(record); } // 获取历史成绩 public List<ScoreRecord> getScoreHistory() { return Collections.unmodifiableList(scores); } } // 成绩记录类 class ScoreRecord { private LocalDateTime timestamp; private int wordsPerMinute; private double accuracy; private String exerciseText; public ScoreRecord(int wpm, double accuracy, String text) { this.timestamp = LocalDateTime.now(); this.wordsPerMinute = wpm; this.accuracy = accuracy; this.exerciseText = text; } @Override public String toString() { return String.format("%tF %tT | WPM: %d | 准确率: %.2f%% | 练习文本: %s", timestamp, timestamp, wordsPerMinute, accuracy, exerciseText.substring(0, Math.min(20, exerciseText.length())) + "..."); } } // 练习管理器 class ExerciseManager { private static final String[] TEXT_SAMPLES = { "The quick brown fox jumps over the lazy dog", "Programming is the art of telling another human what one wants the computer to do", "Java is to JavaScript what car is to carpet", "Practice makes perfect when learning to type quickly and accurately", "Object oriented programming helps model real world scenarios in code" }; // 获取随机练习文本 public String getRandomText() { Random rand = new Random(); return TEXT_SAMPLES[rand.nextInt(TEXT_SAMPLES.length)]; } // 计算打字成绩 public ScoreRecord calculateScore(String original, String typed, long seconds) { int totalChars = original.length(); int correctChars = 0; for (int i = 0; i < Math.min(original.length(), typed.length()); i++) { if (original.charAt(i) == typed.charAt(i)) { correctChars++; } } double accuracy = (double) correctChars / totalChars * 100; int words = original.split("\\s+").length; int wpm = (int) (words / (seconds / 60.0)); return new ScoreRecord(wpm, accuracy, original); } } // 文件管理器 class FileManager { private static final String USER_FILE = "users.dat"; // 保存用户数据 public static void saveUsers(Map<String, User> users) { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(USER_FILE))) { oos.writeObject(users); } catch (IOException e) { System.err.println("用户数据保存失败: " + e.getMessage()); } } // 加载用户数据 @SuppressWarnings("unchecked") public static Map<String, User> loadUsers() { File file = new File(USER_FILE); if (!file.exists()) return new HashMap<>(); try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(USER_FILE))) { return (Map<String, User>) ois.readObject(); } catch (IOException | ClassNotFoundException e) { System.err.println("用户数据加载失败: " + e.getMessage()); return new HashMap<>(); } } } // 主系统类 public class TypingTutorSystem { private Map<String, User> users; private User currentUser; private final ExerciseManager exerciseManager = new ExerciseManager(); private final Scanner scanner = new Scanner(System.in); public TypingTutorSystem() { this.users = FileManager.loadUsers(); } // 主菜单 public void start() { while (true) { System.out.println("\n===== 打字训练系统 ====="); System.out.println("1. 注册"); System.out.println("2. 登录"); System.out.println("3. 退出"); System.out.print("请选择: "); int choice = scanner.nextInt(); scanner.nextLine(); // 消耗换行符 switch (choice) { case 1: registerUser(); break; case 2: loginUser(); break; case 3: FileManager.saveUsers(users); System.out.println("系统已退出"); return; default: System.out.println("无效选择"); } } } private void registerUser() { System.out.print("输入用户名: "); String username = scanner.nextLine(); if (users.containsKey(username)) { System.out.println("用户名已存在"); return; } System.out.print("输入密码: "); String password = scanner.nextLine(); users.put(username, new User(username, password)); System.out.println("注册成功"); } private void loginUser() { System.out.print("用户名: "); String username = scanner.nextLine(); if (!users.containsKey(username)) { System.out.println("用户不存在"); return; } System.out.print("密码: "); String password = scanner.nextLine(); User user = users.get(username); if (user.authenticate(password)) { currentUser = user; userMenu(); } else { System.out.println("密码错误"); } } private void userMenu() { while (currentUser != null) { System.out.println("\n===== 用户菜单 (" + currentUser.getUsername() + ") ====="); System.out.println("1. 开始练习"); System.out.println("2. 查看历史成绩"); System.out.println("3. 注销"); System.out.print("请选择: "); int choice = scanner.nextInt(); scanner.nextLine(); // 消耗换行符 switch (choice) { case 1: startExercise(); break; case 2: showHistory(); break; case 3: currentUser = null; System.out.println("已注销"); return; default: System.out.println("无效选择"); } } } private void startExercise() { String text = exerciseManager.getRandomText(); System.out.println("\n请准确输入以下文本:"); System.out.println(">>> " + text + "\n"); long startTime = System.currentTimeMillis(); System.out.print("开始输入: "); String typed = scanner.nextLine(); long endTime = System.currentTimeMillis(); long seconds = (endTime - startTime) / 1000; ScoreRecord record = exerciseManager.calculateScore(text, typed, seconds); currentUser.addScoreRecord(record); System.out.println("\n练习结果:"); System.out.println("用时: " + seconds + "秒"); System.out.println("速度: " + record.getWordsPerMinute() + " WPM"); System.out.printf("准确率: %.2f%%\n", record.getAccuracy()); } private void showHistory() { List<ScoreRecord> history = currentUser.getScoreHistory(); if (history.isEmpty()) { System.out.println("暂无历史记录"); return; } System.out.println("\n===== 历史成绩记录 ====="); for (int i = 0; i < history.size(); i++) { System.out.println((i+1) + ". " + history.get(i)); } } public static void main(String[] args) { new TypingTutorSystem().start(); } } ``` ### 系统设计说明 #### 1. 核心类结构 - **User类**:管理用户信息、认证和成绩记录 - **ScoreRecord类**:存储单次练习的成绩数据(时间、速度、准确率) - **ExerciseManager类**:提供练习文本和成绩计算逻辑 - **FileManager类**:处理用户数据的持久化存储 - **TypingTutorSystem类**:系统主控程序,处理用户交互 #### 2. 关键功能实现 - **用户认证系统**:注册/登录流程,密码验证 - **随机文本生成**:从预设文本库随机选择练习内容 - **成绩计算算法**: ```java int totalChars = original.length(); int correctChars = 0; // 计算正确字符数 for (int i = 0; i < Math.min(original.length(), typed.length()); i++) { if (original.charAt(i) == typed.charAt(i)) { correctChars++; } } // 计算准确率 double accuracy = (double) correctChars / totalChars * 100; // 计算每分钟字数(WPM) int words = original.split("\\s+").length; int wpm = (int) (words / (seconds / 60.0)); ``` - **数据持久化**:使用对象序列化保存用户数据 #### 3. 使用说明 1. 首次运行系统时会创建用户数据文件 2. 注册新用户后即可登录进行打字练习 3. 练习时系统会显示随机文本并计时 4. 输入完成后自动计算并显示成绩 5. 历史成绩记录可随时查看 #### 4. 扩展建议 - 增加难度分级(简单/中等/困难) - 添加实时打字错误提示 - 实现网络排行榜功能 - 增加打字技巧教程模块 - 支持自定义练习文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值