🏆本文收录于「滚雪球学SpringBoot」(全网一个名)专栏,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
前言
忆起,在大学时,很多计算机专业的同学都会做一个经典的编程课题------学生信息管理系统。那时候,编程老师往往从这个项目开始,引导我们一步一步成长为标准程序员。大家端着一杯咖啡,带着对编程的好奇心,通宵熬夜在实验室写代码。虽然那时的代码可能有些生硬,设计也不完美,但正是通过这个项目,我们从一个个编程小白慢慢过渡到能解决实际问题的开发者。
转眼间,大学毕业后,我们都已经走入了社会,成了在开发岗位上摸爬滚打的"资深"程序员。回想起当年做学生信息管理系统的经历,仿佛又回到了那些青涩的大学时光。那时的我们满怀激情,带着对编程的无尽探索和好奇,面对代码时既有焦虑,也有解决问题时的满足感。这些都是我们编程生涯中不可磨灭的回忆。
而今天,当我们回头看那个简单的学生信息管理系统时,才深刻意识到,那时的学习和实践对我们有多么重要。通过那个项目,我们不仅掌握了 Java 编程的基础,还学会了如何组织和管理数据,如何设计类、搭建系统,甚至理解了如何将数据持久化,存储到文件里。这些看似简单的技术,实际上在今天的工作中无处不在。
这一次,我决定再次从头开始,纯手"撸"一个学生信息管理系统,将这个项目带给那些刚开始接触编程的小白。对于零基础的朋友来说,这将是你们接触编程的第一步。而对于已经有些经验的开发者来说,回顾这个项目,会让你们感叹自己从当初的稚嫩,到现在的成熟,程序员之路的成长和变化。
通过这个项目,我们不仅可以重温大学时的快乐时光,感受编程的乐趣,还能帮助零基础的小伙伴们一步步走近编程。让我们一起回到那个青涩的年代,手把手带着大家一起完成编码,做出一个简单的学生信息管理系统(命令行版本),让他们在编程的路上走得更稳。
项目概述
本项目是一个学生信息管理系统,主要目的是模拟学校如何对学生信息进行管理。通过该系统,用户能够实现学生信息的增、删、改、查等常见操作。具体功能包括:
- 添加学生信息:用户可以输入学号、姓名、性别、年龄等基本信息,添加到系统中。
- 删除学生信息:根据学生学号删除已存在的学生信息,确保数据的准确性。
- 修改学生信息:用户可以修改学生的姓名、性别、年龄等信息,保持系统数据的更新。
- 查看所有学生信息:用户可以查看当前系统中存储的所有学生信息。
- 学号唯一性校验:每个学生必须有一个唯一的学号,系统会检查用户输入的学号是否已存在。
- 数据持久化:通过文件操作,将学生信息保存到本地文件(如 CSV 文件),即使系统重启后,数据依然能够恢复。
技术要点
- Java 基础语法:包括类、对象、方法、构造方法等基本的 Java 编程概念。通过这个系统,我们将深刻理解如何在 Java 中组织和管理代码。
- 集合类 :我们使用
HashMap
来存储学生信息。HashMap
根据学号快速存取学生信息,保证我们能够高效进行学生数据的查找、修改和删除。 - 文件 I/O 操作 :通过 Java 的
BufferedReader
和BufferedWriter
类,实现数据的读取和保存,从而让数据能够在系统退出后持久化保存。

项目结构
- Student.java:定义学生类,封装学生的基本信息及相关操作方法。
- StudentManager.java:负责学生数据的增、删、改、查操作。
- StudentSystem.java:主类,处理用户输入和系统交互,通过控制台菜单引导用户操作。
设计思路
我先给大家罗列下,该系统整体的一个实现步骤,具体步骤如下:结合整个学生信息管理系统的流程,下面是 Student
类的工作步骤解析:
1. 完整实现步骤
步骤 1: 学生信息添加
- 用户输入学生信息(学号、姓名、性别、年龄)。
Student
类通过构造方法创建一个新的学生对象。- 学生对象通过
StudentManager
的addStudent
方法被添加到内存中的HashMap
数据结构中,保证学号唯一性。
步骤 2: 显示所有学生信息
StudentManager
类调用displayAllStudents
方法,遍历所有存储的学生对象。- 每个学生对象的
toString
方法被调用,输出格式化的学生信息,显示在命令行界面上。
步骤 3: 删除学生信息
- 用户通过学号删除学生。
StudentManager
类通过学号从HashMap
中删除对应的学生对象。
步骤 4: 修改学生信息
- 用户选择修改学生信息(如修改姓名、性别、年龄等)。
StudentManager
类根据学号找到对应的学生对象,并通过相应的Setter
方法更新学生的属性。
步骤 5: 持久化存储学生信息
- 在系统退出时,
StudentManager
会调用saveData
方法,将所有学生对象的信息保存到 CSV 文件中。 - 每个学生对象的
toString
方法将学生信息转化为 CSV 格式字符串,最终写入到文件中。
步骤 6: 从文件加载学生信息
- 系统启动时,
StudentManager
类会调用loadData
方法,从文件中读取学生信息。 - 每一行 CSV 数据通过
fromCSV
方法转化为Student
对象,加载到内存中的HashMap
。

2. 学生类(Student.java)
我们首先要设计一个 Student
类,表示一个学生对象。每个学生的基本信息包括学号、姓名、性别和年龄。Student
类不仅仅是用来存储这些数据,它还包含了方法,用于输出学生的基本信息,或者从 CSV 文件中读取数据并转换为学生对象。
学生类的设计(代码演示)
java
/**
* @Author bug菌
* @Source 公众号:猿圈奇妙屋
* @date: 2025-07-31 15:56
*/
public class Student {
private String studentId; // 学号
private String name; // 姓名
private String gender; // 性别
private int age; // 年龄
// 构造方法
public Student(String studentId, String name, String gender, int age) {
this.studentId = studentId;
this.name = name;
this.gender = gender;
this.age = age;
}
// Getter 和 Setter 方法
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 输出学生信息的方法
public String toString() {
return studentId + "," + name + "," + gender + "," + age;
}
// 从CSV数据中读取学生信息
public static Student fromCSV(String csvData) {
String[] data = csvData.split(",");
return new Student(data[0], data[1], data[2], Integer.parseInt(data[3]));
}
}

代码解析:
在这个简单的学生信息管理系统 中,Student
类是核心组成部分之一,负责存储和管理学生信息。接下来,我将结合整个项目的实现步骤,详细解析 Student
类的作用及其实现步骤。
1. 类的设计与目的
Student
类主要用于封装学生的基本信息,包括:
- 学号 (
studentId
) - 姓名 (
name
) - 性别 (
gender
) - 年龄 (
age
)
在本项目中,我们利用这个类来创建学生对象,将其保存到内存中的数据结构中,并能够在文件存储和读取过程中方便地操作学生信息。
2. 构造方法与初始化
作用:
- 构造方法初始化了
Student
类的四个属性(学号、姓名、性别和年龄),确保每个学生对象在创建时都拥有完整的基本信息。 - 这个方法将会在
StudentManager
中用于创建新的学生对象,并将其添加到存储学生信息的集合中。
在整个项目中的使用:
- 当用户添加学生时,我们通过调用这个构造方法创建一个新的学生对象,并将其存储到
StudentManager
类中维护的集合(如HashMap
)中。
3. Getter 和 Setter 方法
作用:
- Getter 方法:用于获取每个学生的属性值。
- Setter 方法:用于设置或修改学生对象的属性值。
在整个项目中的使用:
- 这些方法在
StudentManager
类中被调用,用于获取学生信息或修改学生信息。例如,在修改学生信息时,我们通过setName
、setAge
等方法来更新学生的姓名、年龄等属性。
4. toString
方法
java
public String toString() {
return studentId + "," + name + "," + gender + "," + age;
}
作用:
- 该方法用于返回学生信息的字符串表示。返回格式为:
学号, 姓名, 性别, 年龄
,即以 CSV 格式表示。
在整个项目中的使用:
- 在
StudentManager
类中,当我们需要将学生信息保存到文件(如 CSV 文件)时,可以使用toString()
方法将学生对象转化为一个字符串,便于写入文件。 - 同时,
toString()
方法还可以用于显示学生信息,例如在命令行中查看所有学生时,toString()
会返回每个学生的信息,并打印出来。

5. fromCSV
方法
作用:
- 该方法将 CSV 格式的字符串数据转换为
Student
对象。例如,输入1001,John,Male,20
,输出的是一个包含这些信息的Student
对象。
在整个项目中的使用:
- 当从文件加载学生信息时,
fromCSV
方法会被调用。StudentManager
类使用该方法将文件中的每一行(每一条学生记录)转换成一个Student
对象,并将这些对象存储到集合中。
3. 学生管理类(StudentManager.java)
StudentManager
类的核心功能是管理学生信息的增、删、改、查操作。它内部使用了 HashMap
来存储学生信息。通过学号来快速查找和修改学生信息,同时提供数据的持久化支持。
学生管理类设计(代码演示)
java
import java.util.HashMap;
import java.io.*;
/**
* @Author bug菌
* @Source 公众号:猿圈奇妙屋
* @date: 2025-07-31 15:56
*/
public class StudentManager {
private HashMap<String, Student> studentMap; // 存储学生信息(学号 -> 学生对象)
public StudentManager() {
studentMap = new HashMap<>();
loadData(); // 从文件加载数据
}
// 添加学生信息
public void addStudent(Student student) {
if (studentMap.containsKey(student.getStudentId())) {
System.out.println("学号已存在,不能添加!");
} else {
studentMap.put(student.getStudentId(), student);
System.out.println("学生添加成功!");
}
}
// 删除学生信息
public void removeStudent(String studentId) {
if (studentMap.containsKey(studentId)) {
studentMap.remove(studentId);
System.out.println("学生删除成功!");
} else {
System.out.println("学号不存在,无法删除!");
}
}
// 修改学生信息
public void updateStudent(String studentId, String name, String gender, int age) {
if (studentMap.containsKey(studentId)) {
Student student = studentMap.get(studentId);
student.setName(name);
student.setGender(gender);
student.setAge(age);
System.out.println("学生信息修改成功!");
} else {
System.out.println("学号不存在,无法修改!");
}
}
// 输出所有学生信息
public void displayAllStudents() {
if (studentMap.isEmpty()) {
System.out.println("没有学生信息!");
} else {
for (Student student : studentMap.values()) {
System.out.println(student);
}
}
}
// 加载文件中的学生数据
private void loadData() {
File file = new File("students.csv");
try {
if (!file.exists()) {
file.createNewFile();
System.out.println("文件不存在,已创建新的文件:students.csv");
}
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
Student student = Student.fromCSV(line);
studentMap.put(student.getStudentId(), student);
}
}
} catch (IOException e) {
System.out.println("加载数据失败!" + e.getMessage());
}
}
// 将学生数据保存到文件
public void saveData() {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("students.csv"))) {
for (Student student : studentMap.values()) {
bw.write(student.toString());
bw.newLine();
}
System.out.println("数据保存成功!");
} catch (IOException e) {
System.out.println("保存数据失败!");
}
}
}

代码解析:
StudentManager
类的主要职责是管理学生信息的增、删、改、查等操作,并实现学生信息的持久化存储。接下来,我们详细解析 StudentManager
类的各个方法,结合整个学生信息管理系统,逐步介绍它们的实现步骤。
1. 成员变量:studentMap
studentMap
是一个 HashMap
,用来存储学生信息。键是学生的学号(String
类型),值是 Student
对象。通过学号,我们能够快速访问和操作学生的信息。
2. 构造方法:StudentManager()
-
功能 :在类初始化时,
studentMap
被初始化为一个空的HashMap
。然后,通过调用loadData()
方法,从存储的文件(students.csv
)中加载学生数据,确保在程序启动时,所有已经存在的学生信息能够加载到内存中。 -
作用 :当系统启动时,自动加载已有的学生数据,并填充
studentMap
。如果文件不存在,系统会自动创建一个空的文件,保证数据可以保存。
3. 添加学生信息:addStudent()
-
功能 :该方法将新学生信息添加到
studentMap
中。 -
步骤:
- 通过
student.getStudentId()
获取学生的学号,检查该学号是否已存在于studentMap
中。 - 如果学号已存在,打印提示信息并返回;如果学号不存在,则将学生对象添加到
studentMap
中。
- 通过
-
作用:这确保了每个学生的信息都具有唯一的学号,避免了重复添加相同学号的学生。
4. 删除学生信息:removeStudent()
-
功能:根据学号删除学生信息。
-
步骤:
- 通过
studentMap.containsKey(studentId)
检查该学号是否存在。 - 如果学号存在,调用
studentMap.remove(studentId)
删除该学生信息。 - 如果学号不存在,打印提示信息,表示无法删除。
- 通过
-
作用:这个方法实现了删除操作,通过学号来唯一标识学生信息,确保学生数据的准确管理。
5. 修改学生信息:updateStudent()
-
功能:修改已存在学生的信息(如姓名、性别、年龄)。
-
步骤:
- 通过
studentMap.containsKey(studentId)
检查学号是否存在。 - 如果学号存在,通过
studentMap.get(studentId)
获取学生对象,然后更新学生的姓名、性别和年龄。 - 如果学号不存在,打印提示信息,表示无法修改。
- 通过
-
作用:该方法提供了修改学生信息的功能,确保学生数据的最新性。
6. 显示所有学生信息:displayAllStudents()
-
功能 :显示所有存储在
studentMap
中的学生信息。 -
步骤:
- 如果
studentMap
是空的,打印"没有学生信息!"。 - 如果
studentMap
中有学生信息,遍历所有学生并打印每个学生的信息(通过调用Student
类的toString()
方法)。
- 如果
-
作用:该方法可以帮助用户查看当前存储在系统中的所有学生信息。
7. 加载数据:loadData()
-
功能 :从
students.csv
文件中加载学生数据,恢复系统数据。 -
步骤:
- 如果文件不存在,创建一个新的空文件。
- 如果文件存在,通过
BufferedReader
逐行读取文件内容。 - 每一行数据通过
Student.fromCSV()
方法转换为Student
对象,然后将其添加到studentMap
中。
-
作用:确保系统能够从文件中加载之前保存的学生信息,恢复系统状态。
8. 保存数据:saveData()
-
功能 :将当前内存中的学生信息保存到
students.csv
文件中。 -
步骤:
- 通过
BufferedWriter
将每个学生的信息逐行写入文件。 - 每个学生的信息通过调用
student.toString()
方法转化为 CSV 格式的字符串。
- 通过
-
作用:在系统退出时,将内存中的数据保存到文件,确保数据的持久化。
4. 主类(StudentSystem.java)
主类 StudentSystem
负责与用户进行交互,提供一个命令行界面,用户通过输入选项来进行操作。以下是主要流程:
主类设计(代码演示)
java
import java.util.Scanner;
/**
* @Author bug菌
* @Source 公众号:猿圈奇妙屋
* @date: 2025-07-31 15:56
*/
public class StudentSystem {
private static StudentManager manager = new StudentManager();
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
System.out.println("学生信息管理系统");
System.out.println("1. 添加学生信息");
System.out.println("2. 删除学生信息");
System.out.println("3. 修改学生信息");
System.out.println("4. 显示所有学生信息");
System.out.println("5. 退出");
System.out.print("请输入您的选择:");
int choice = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (choice) {
case 1:
addStudent();
break;
case 2:
removeStudent();
break;
case 3:
updateStudent();
break;
case 4:
manager.displayAllStudents();
break;
case 5:
manager.saveData(); // 保存数据
System.out.println("退出系统...");
return;
default:
System.out.println("无效选择,请重新输入!");
}
}
}
private static void addStudent() {
System.out.print("请输入学号:");
String studentId = scanner.nextLine();
System.out.print("请输入姓名:");
String name = scanner.nextLine();
System.out.print("请输入性别:");
String gender = scanner.nextLine();
System.out.print("请输入年龄:");
int age = scanner.nextInt();
Student student = new Student(studentId, name, gender, age);
manager.addStudent(student);
}
private static void removeStudent() {
System.out.print("请输入要删除的学号:");
String studentId = scanner.nextLine();
manager.removeStudent(studentId);
}
private static void updateStudent() {
System.out.print("请输入要修改的学号:");
String studentId = scanner.nextLine();
System.out.print("请输入新的姓名:");
String name = scanner.nextLine();
System.out.print("请输入新的性别:");
String gender = scanner.nextLine();
System.out.print("请输入新的年龄:");
int age = scanner.nextInt();
manager.updateStudent(studentId, name, gender, age);
}
}

代码解析:
StudentSystem
类是整个学生信息管理系统的主程序,它提供了一个命令行界面,允许用户通过输入命令选择不同的操作,如添加、删除、修改和查看学生信息。以下是该类的逐步解析及实现细节:
1. 成员变量
manager
:这是一个StudentManager
对象,负责管理学生信息的增、删、改、查等操作。所有的学生数据和操作都通过它来实现。scanner
:这是一个Scanner
对象,用于接收用户在命令行中输入的操作命令。
2. 主方法:main(String[] args)
-
功能 :
main
方法启动了一个无限循环,提供了一个菜单,用户可以根据提示输入选项执行对应的操作。-
操作选项:每次显示以下选项:
- 添加学生信息
- 删除学生信息
- 修改学生信息
- 显示所有学生信息
- 退出系统
-
用户输入数字后,根据选择进入相应的操作。
-
scanner.nextLine()
用来消耗换行符,避免影响后续输入。
-
3. addStudent()
方法
-
功能:该方法用于从用户输入中获取学生信息,并将新学生对象添加到系统中。
-
操作流程:
- 用户输入学号、姓名、性别和年龄。
- 创建一个新的
Student
对象,并通过manager.addStudent(student)
将其添加到学生信息管理系统中。 addStudent
方法会将学生对象存入StudentManager
的studentMap
中。
4. removeStudent()
方法
-
功能:该方法根据学号删除学生信息。
-
操作流程:
- 用户输入要删除的学生学号。
- 调用
manager.removeStudent(studentId)
方法删除该学号对应的学生数据。 removeStudent
方法会从StudentManager
中的studentMap
中移除对应学号的学生。
5. updateStudent()
方法
-
功能:该方法根据学号修改学生信息(姓名、性别、年龄)。
-
操作流程:
- 用户输入要修改的学生学号。
- 输入新的姓名、性别和年龄。
- 调用
manager.updateStudent(studentId, name, gender, age)
方法更新学生信息。

案例结果演示
根据如上的测试用例,作者在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。
1. 运行整体效果
我们启动main函数,运行起来,我们可以看到,控制台会列出相关文字版的菜单:

2. 信息录入
我们先来操作一下,输入1,测试学生信息录入功能。

3. 删除学生
输入2,输入对应的学生编号,进行测试删除学生功能。

4. 学生信息修改
输入3,输入对应的学生编号,进行测试修改学生信息功能。

5. 学生信息查询
输入4,进行测试查询所有学生信息列表功能。

6. 系统退出
输入5,进行测试退出系统。

验证是否按退出系统后,会保存上次操作录入的学生信息,我们打开对应的students.csv文件,可以查验下。

7. 再次访问系统
我们再次访问,需要测试两件事:
- 是否会继续将录入的学生信息追加到students.csv文件里。
- 是否能查询上次的学生信息。
我们先进行查询操作。

经过如下操作演示,明显可以看到,如上两件事,均与预期一致。

OK,一把过,完美!请大家放心食用...
总结
说到这里,本期内容就要告一段落了,通过实现这个简易的学生信息管理系统,我们不仅可以完成学生信息的增删改查等基本操作,还能掌握 Java 中集合类、文件 I/O 操作、异常处理等重要知识点。这个项目的实现为我们后续学习更复杂的系统打下了坚实的基础。同时,随着需求的增加,我们可以在这个系统基础上不断拓展新功能,例如添加学籍信息、成绩管理、学生查询等,进一步提高系统的实用性和复杂度。
这个项目不仅仅是一个编程练习,更是一次全面理解编程语言、算法设计、数据结构和系统设计的机会。无论你是刚刚入门的学生,还是有一定基础的开发者,这个项目都能够为你提供实用的编程经验,帮助你在实际工作中更加高效地解决问题。
📣 关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题(好多小伙伴靠这个宝典拿到了多家大厂的offer)、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-