Java学生信息管理系统——使用序列化操作读写数据
Java学生信息管理系统
类(Student.java)
属性名 | 类型 | 说明 |
---|---|---|
id | String | 学生学号 |
name | String | 学生姓名 |
address | String | 居住地址 |
phoneNum | String | 联系方式 |
age | int | 年龄 |
import java.io.Serializable;
// 学生类
public class Student implements Serializable {
private String id;
private String name;
private String address;
private String phoneNum;
private int age;
// 有参构造函数
/**
*
* @param id 学号
* @param name 姓名
* @param address 地址
* @param phoneNum 联系方式
* @param age 年龄
*/
public Student(String id, String name, String address, String phoneNum, int age) {
this.id = id;
this.name = name;
this.address = address;
this.phoneNum = phoneNum;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.id + "\t\t" + this.name + "\t\t" + this.phoneNum + "\t\t" + this.age + "\t\t" + this.address;
}
}
本项目采用了序列化操作来存储学生信息,所以Student类需要实现Serializable接口(有关序列化操作将在后续讲解)。由于Student类的属性都是private修饰,因此需要为每个属性添加setter和getter方法以便于后续对属性的访问和修改。此外,重写了Student类的toString()方法,目的是便于后续输出学生信息。
主界面(MainClass.java)
控制台输出选项菜单,用户可以通过输入选项菜单前的序号来选择对应的操作。通过switch语句来判断用户选择的操作。
import java.util.ArrayList;
import java.util.Scanner;
public class MainClass {
private static FileUtils fileUtils = new FileUtils("./data.txt");;
private static ArrayList<Student> studentsList;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int choice = 0;
while (true) {
// 打印选项列表
printChoice();
// 输入选项序号
choice = input.nextInt();
switch (choice) {
case 1:
studentsList = fileUtils.readFile();
if (studentsList == null) {
studentsList = new ArrayList<>();
}
Student student = addStudent();
studentsList.add(student);
fileUtils.writeFile(studentsList);
break;
case 2:
System.out.print("您要删除学生的学号:");
input.nextLine();
String id = input.nextLine();
studentsList = fileUtils.readFile();
boolean flag_delete = false;
for (int i = 0; i < studentsList.size(); i++) {
// 若有该学生信息
if(id.equals(studentsList.get(i).getId())){
studentsList.remove(i);
fileUtils.writeFile(studentsList);
flag_delete = true;
System.out.println("删除成功!!!");
break;
}
}
if(!flag_delete){
System.out.println("无该学生信息!!!");
}
break;
case 3:
System.out.print("您要修改学生的学号:");
input.nextLine();
String id1 = input.nextLine();
boolean flag_edit = false;
studentsList = fileUtils.readFile();
for (int i = 0; i < studentsList.size(); i++) {
// 若有该学生信息
if(id1.equals(studentsList.get(i).getId())){
Student student1 = editInformation(studentsList.get(i));
studentsList.set(i, student1);
fileUtils.writeFile(studentsList);
flag_edit = true;
System.out.println("修改成功!!!");
break;
}
}
if(!flag_edit){
System.out.println("无该学生信息!!!");
}
break;
case 4:
System.out.print("您要查找的学生的学号:");
input.nextLine();
String id2 = input.nextLine();
boolean flag_search = false;
studentsList = fileUtils.readFile();
for (int i = 0; i < studentsList.size(); i++) {
// 若有该学生信息
if(id2.equals(studentsList.get(i).getId())){
Student student2 = editInformation(studentsList.get(i));
flag_search = true;
print_one(student2);
break;
}
}
if(!flag_search){
System.out.println("无该学生信息!!!");
}
break;
case 5:
studentsList = fileUtils.readFile();
if (studentsList != null && studentsList.size() > 0) {
printAll(studentsList);
}else{
System.out.println("无学生信息!!!");
}
break;
case 6:
deleteAll();
System.out.println("删除成功!!!");
break;
case 7:
// 退出系统
System.exit(0);
break;
}
}
}
/**
* 打印操作选项
*/
public static void printChoice() {
System.out.println("\n----------学生信息管理系统----------");
System.out.println("1.添加学生");
System.out.println("2.删除学生");
System.out.println("3.修改学生信息");
System.out.println("4.根据学号查找学生");
System.out.println("5.查看所有学生信息");
System.out.println("6.删除所有学生信息");
System.out.println("7.退出系统");
System.out.print("您的选择:");
}
/**
* 添加学生信息
*/
public static Student addStudent() {
String id, name, address, phoneNum;
int age;
Scanner input = new Scanner(System.in);
System.out.print("请输入学生学号:");
id = input.nextLine();
System.out.print("请输入学生姓名:");
name = input.nextLine();
System.out.print("请输入学生年龄:");
age = input.nextInt();
// 吞掉多余的回车
input.nextLine();
System.out.print("请输入学生居住地址:");
address = input.nextLine();
System.out.print("请输入学生联系方式:");
phoneNum = input.nextLine();
// 返回学生对象
return new Student(id, name, address, phoneNum, age);
}
/**
* 查询所有学生信息
* @return 返回学生列表
*/
public static ArrayList<Student> searchAll() {
return fileUtils.readFile();
}
/**
* 控制台输出所有学生信息
* @param list 学生信息列表
*/
public static void printAll(ArrayList<Student> list) {
System.out.println("学号\t\t\t\t姓名\t\t\t联系方式\t\t\t年龄\t\t\t居住地址");
for (Student student: list) {
System.out.println(student.toString());
}
}
/**
* 删除所有学生信息
*/
public static void deleteAll() {
studentsList.clear();
fileUtils.writeFile(studentsList);
}
/**
* 修改学生信息
* @param student 待修改的学生
* @return 返回修改后的学生信息
*/
public static Student editInformation(Student student) {
// 调用添加学生方法即可
student = addStudent();
return student;
}
/**
* 输出一个学生的信息
* @param student 学生对象
*/
public static void print_one(Student student) {
System.out.println("学号\t\t\t\t姓名\t\t\t联系方式\t\t\t年龄\t\t\t居住地址");
System.out.println(student.toString());
}
}
序列化详解
1、序列化与反序列化
序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。
即将对象转化为二进制,用于保存,或者网络传输。
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
与序列化相反,将二进制转化成对象。
2、序列化的作用
① 想把内存中的对象保存到一个文件中或者数据库中时候;
② 想用套接字在网络上传送对象的时候;
③ 想通过RMI传输对象的时候
一些应用场景,涉及到将对象转化成二进制,序列化保证了能够成功读取到保存的对象。要实现对象的序列化,最直接的操作就是实现Serializable接口,使用IO流中的对象流可以实现序列化操作,将对象保存到文件,再读取出来。
本项目则是采用Student类实现Serializable接口的方法。
参考博客链接
文件操作(FileUtiles.java)
import java.io.*;
import java.util.ArrayList;
/**
* 文件读取工具类
* 封装了文件操作相关的函数
*/
public class FileUtils {
private String file_path;
/**
* 构造函数
* @param file_path 文件地址
*/
public FileUtils(String file_path) {
this.file_path = file_path;
}
/**
* 写文件 采用序列化操作读写对象
* @param studentList 学生对象列表
*/
public void writeFile(ArrayList<Student> studentList){
// 输出流
try {
File file = new File(this.file_path);
if (!file.exists()) {
file.createNewFile();
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(studentList);
objectOutputStream.flush();
objectOutputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 读取文件
* @return 返回学生信息列表
*/
public ArrayList<Student> readFile() {
try {
File file = new File(this.file_path);
if (!file.exists()) {
return null;
}
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(this.file_path));
ArrayList<Student> studentList = (ArrayList<Student>) objectInputStream.readObject();
return studentList;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}