运用序列化与反序列化完成学生信息系统

1、请使用序列化和反序列化机制,完成学生信息管理系统。

系统打开时显示以下信息:
欢迎使用学生信息管理系统,请认真阅读以下使用说明:
请输入不同的功能编号来选择不同的功能:
[1]查看学生列表
[2]保存学生
[3]删除学生
[4]查看某个学生详细信息

--------------------------------------------------------------------
学生信息列表展示
学号 姓名 性别
------------------------------------
1 zhangsan 男
2 lisi 女
.....

--------------------------------------------------------------------
查看某个学生详细信息
学号:1
姓名:张三
生日:1990-10-10
性别:男
邮箱:[email protected]

---------------------------------------------------------------------
删除学生时,需要让用户继续输入删除的学生编号,根据编号删除学生。

注意:请使用序列化和反序列化,以保证关闭之后,学生数据不丢失。
学生数据要存储到文件中。

 

根据题意我增加了一些功能,具体功能如下

[1]查看学生列表
[2]保存学生
[3]删除学生
[4]查看某个学生详细信息
[5]添加学生
[6]退出系统
[0]调出使用菜单

在增加新学生信息进入系统时可根据学生的学号进行自动排序。

扔出代码:

package com.cy.javase.serializable;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.*;

public class StudentSystem extends Thread{
    private static List students= null;
    @Override
    public void run() {
        //调用初始化方法读取学生信息
        students= StudentSystemInitialized.initialized();
        System.out.println("欢迎使用学生信息管理系统,请认真阅读以下使用说明:");
        System.out.println("请输入不同的功能编号来选择不同的功能:");
        System.out.println("[1]查看学生列表\n[2]保存学生\n[3]删除学生\n[4]查看某个学生详细信息\n[5]添加学生\n[6]退出系统\n[0]调出使用菜单");
        while (true){
            Scanner s = new Scanner(System.in);
            int i =  s.nextInt();
            switch (i){
                case 0:
                    System.out.println("[1]查看学生列表\n[2]保存学生\n[3]删除学生\n[4]查看某个学生详细信息\n[5]添加学生\n[6]退出系统\n[0]调出使用菜单");
                    break;
                case 1:
                    System.out.println("----------------------------------------------");
                    System.out.println("学生信息展示");
                    System.out.println("学号          姓名          性别");
                    System.out.println("----------------------------------------------");
                    for (Student student:students){
                        System.out.println(student.getNo()+"         "+student.getName()+"          "+ (student.isGender()?"男":"女"));
                    }
                    System.out.println("-----------------------------------------------");
                    break;
                case 2:
                    save();
                    break;
                case 3:
                    System.out.print("请输入要删除学生信息的学号:");
                    deleStudent(new Scanner(System.in).nextInt());
                    break;
                case 4:
                    System.out.print("请输入要查看学生信息的学号:");
                    information(new Scanner(System.in).nextInt());
                    break;
                case 5:
                    System.out.print("请输入学生的下列信息:\n[姓名]:");
                    String name = new Scanner(System.in).next();
                    System.out.print("[学号]:");
                    int no = new Scanner(System.in).nextInt();
                    System.out.print("[性别(男为true,女为false)]:");
                    boolean gender = new Scanner(System.in).nextBoolean();
                    System.out.print("[生日(yy-MM-dd)]:");
                    String birth = new Scanner(System.in).next();
                    System.out.print("邮箱:");
                    String email = new Scanner(System.in).next();
                    addStudent(name,no,gender,birth,email);
                    break;
                case 6:
                    System.exit(0);
                default:
            }
        }
    }
    //添加学生功能
    private void addStudent(String name, int no, boolean gender, String birth, String email){
        Student stu = new Student(name, no,  gender,  birth,  email);
        //根据学生学号进行排序放入ArrayList数组
        if(students.size() == 0){
            students.add(stu);
        }else {
            for (Student student : students) {
                if (student.getNo()>stu.getNo()){
                    students.add(students.indexOf(student),stu);
                    return;
                }
            }
            students.add(stu);
        }
    }
    //删除学生功能
    private void deleStudent(int no){
        Student str = null;
        for (Student student:students){
            if(student.getNo() == no){
                str = student;
            }
        }
        students.remove(students.indexOf(str));
    }
    //学生信息详情展示功能
    private void information(int no){
        Student str = null;
        for (Student student:students){
            if(student.getNo() == no){
                str = student;
            }
        }
        System.out.println("-----------------------------------------------");
        System.out.println("学号:"+str.getNo()+"\n"+"姓名:"+str.getName()+"\n"+"生日:"+str.getBirth()+"\n"+"性别:"+(str.isGender()?"男":"女")+"\n"+"邮箱:"+str.getEmail());
        System.out.println("-----------------------------------------------");
    }
    //保存功能
    private void save(){
        ObjectOutputStream oos= null;
        try {
            //此处因idea工具Thread.currentThread().getContextClassLoader().getResource().getPath()方法读取的默认路径为类的根目录下out/production/类名
            //所以序列化文件的输出地址要手写至初始化方法可读取的地址。未满足OCP原则,有待改进。
             oos= new ObjectOutputStream(new FileOutputStream("out/production/day4/students"));
             oos.writeObject(students);
             oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(null!=oos){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

初始化学生信息方法

package com.cy.javase.serializable;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;

public class StudentSystemInitialized {
    public static List initialized(){
        ObjectInputStream ois = null;
        //逆序列化学生信息文件,若没有文件,则初始化一个空的学生信息文件。因为OCP原则读取文件的地址用到了Thread.currentThread().getContextClassLoader().getResource().getPath()方法
        try {
            ois = new ObjectInputStream(new FileInputStream(Thread.currentThread().getContextClassLoader().getResource("students").getPath()));
            List students =  (List) ois.readObject();
            return students;
        } catch (IOException | ClassNotFoundException|NullPointerException e) {
            return new ArrayList();
        }finally {
            if (ois!=null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

学生类

package com.cy.javase.serializable;

import java.io.Serializable;
import java.util.Objects;

public class Student implements Serializable {
    private String name ;
    private int no;
    private boolean gender;
    private String birth;
    private String email;

    public Student(){
    }

    public Student(String name, int no, boolean gender, String birth, String email) {
        this.name = name;
        this.no = no;
        this.gender = gender;
        this.birth = birth;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public String getBirth() {
        return birth;
    }

    public void setBirth(String birth) {
        this.birth = birth;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return no == student.no &&
                gender == student.gender &&
                Objects.equals(name, student.name) &&
                Objects.equals(birth, student.birth) &&
                Objects.equals(email, student.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, no, gender, birth, email);
    }
}

测试主方法

package com.cy.javase.serializable;


public class Test {
    public static void main(String[] args) {
        Thread thread = new StudentSystem();
        thread.run();
    }
}

测试结果示例

运行程序后先加入三个学生的信息

运用序列化与反序列化完成学生信息系统_第1张图片

保存后显示当前学生信息,可见学生以按学号排序

运用序列化与反序列化完成学生信息系统_第2张图片

退出后重启程序,程序可逆序列化保存的序列化文件

运用序列化与反序列化完成学生信息系统_第3张图片

测试删除程序

运用序列化与反序列化完成学生信息系统_第4张图片

 

你可能感兴趣的:(运用序列化与反序列化完成学生信息系统)