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 Liststudents= 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 Listinitialized(){ 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(); } }
测试结果示例
运行程序后先加入三个学生的信息
保存后显示当前学生信息,可见学生以按学号排序
退出后重启程序,程序可逆序列化保存的序列化文件
测试删除程序