大一期末来临,跟着老杜学习了序列化和io的相关知识,并根据老杜给的作业开发了一个小型学生管理系统
题目及思路
原题目:
1、请使用序列化和反序列化机制,完成学生信息管理系统。
系统打开时显示以下信息:
欢迎使用学生信息管理系统,请认真阅读以下使用说明:
请输入不同的功能编号来选择不同的功能:
[1]查看学生列表
[2]保存学生
[3]删除学生
[4]查看某个学生详细信息
学生信息列表展示
学号 姓名 性别
1 zhangsan 男
2 lisi 女
…
查看某个学生详细信息
学号:1
姓名:张三
生日:1990-10-10
性别:男
邮箱:zhangsan@123.com
删除学生时,需要让用户继续输入删除的学生编号,根据编号删除学生。
注意:请使用序列化和反序列化,以保证关闭之后,学生数据不丢失。
学生数据要存储到文件中。
根据题目要求,我尽可能运用面向对象的思路来开发一个带有本地文件的管理系统,使用泛型<Integer,Student>HashMap,通过学号对学生对象进行保存删除删改的操作
我的思路
类 | 方法内容 |
---|---|
StudentSystemTest | 多个switch选项来进行不同的操作 |
StudentSystem | 提供调用学生对象和进行io操作的方法 |
Student | 创建对象信息 |
代码片段
测试类
import java.io.*;
import java.util.*;
public class StudentSystemTest {
public static void main(String[] args) {
StudentSystem studentSystem = new StudentSystem();
Map<Integer,Student> map1;
while (true){
System.out.println("欢迎使用序列化学生信息管理系统!【1】查看学生列表【2】保存学生【3】删除学生【4】查看某个学生详细信息【5】修改当前列表学生信息【6】结束使用该系统");
Scanner sc = new Scanner(System.in);
int choose = sc.nextInt();
switch (choose){
case 1:
try {
map1 = studentSystem.FileInPut();
/*ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt"));
Map<Integer,Student> map1 = (HashMap<Integer,Student>)ois.readObject();
ois.close();
*/
if (map1.size() == 0){
System.out.println("对不起当前列表中不存在学生信息!");
}else{
Set<Map.Entry<Integer,Student>> set1 = map1.entrySet();
for (Map.Entry<Integer,Student> node : set1){
System.out.println(node.getKey() +"."+node.getValue().name());
}
}
}catch (Exception e){
e.printStackTrace();
}
break;
case 2:
System.out.println("请输入学号");
sc = new Scanner(System.in);
int no = sc.nextInt();
if (studentSystem.contains(no)){
System.out.println("对不起已经有此学生存在或学号输入错误,学号应为大于0的数值!");
}else {
System.out.println("请输入姓名");
sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("请输入出生日期,以年-月-日形式");
sc = new Scanner(System.in);
String birth = sc.nextLine();
System.out.println("请输入性别");
sc = new Scanner(System.in);
String sex = sc.nextLine();
System.out.println("请输入邮箱");
sc = new Scanner(System.in);
String email = sc.nextLine();
if (sex.equals("男")|| sex.equals("女")){
studentSystem.studentPackage(no,name,sex,email,birth);
studentSystem.FileOutPut(studentSystem.getMap());
System.out.println("保存成功");
}else {
System.out.println("没性别请勿使用此系统!");
return;
}
}
break;
case 3:
map1 = studentSystem.FileInPut();
if (map1.size() == 0){
System.out.println("对不起当前列表中不存在学生信息!");
}else {
System.out.println("请输入您想要删除学生的学号");
sc = new Scanner(System.in);
int delete = sc.nextInt();
if (map1.containsKey(delete)){
System.out.println("已删除学生:" + map1.get(delete).getName());
map1.remove(delete);
studentSystem.setMap(map1);
studentSystem.FileOutPut(map1);
}else {
System.out.println("对不起,当前列表不存在此学生!");
}
}
break;
case 4:
try {
map1 = studentSystem.FileInPut();
if (map1.size() == 0){
System.out.println("对不起当前列表不存在学生信息");
}else {
System.out.println("请输入想要查找的学生学号");
int search = sc.nextInt();
if (!map1.containsKey(search)){
System.out.println("对不起不存在此学生");
}else {
System.out.println(map1.get(search));
}
}
}catch (Exception e){
e.printStackTrace();
}
break;
case 5:
map1 = studentSystem.FileInPut();
if (map1.size() == 0){
System.out.println("对不起当前列表不存在学生信息");
}else{
System.out.println("请选择您想要修改的学生学号");
sc = new Scanner(System.in);
int search = sc.nextInt();
if (!map1.containsKey(search)){
System.out.println("对不起不存在此学生");
}else {
System.out.println("请选择序号来修改学生"+ map1.get(search).getName() +"的信息【1】生日 【2】邮箱");
sc = new Scanner(System.in);
int chooseChange = sc.nextInt();
switch (chooseChange){
case 1:
System.out.println("请输入新的生日信息!");
sc = new Scanner(System.in);
String birthNew = sc.nextLine();
if (birthNew.equals(map1.get(search).getBirth())){
System.out.println("对不起日期相同!不要玩我!");
}else {
map1.get(search).setBirth(birthNew);
System.out.println("修改成功!");
}
break;
case 2:
System.out.println("请输入新的邮箱信息!");
sc = new Scanner(System.in);
String emailNew = sc.nextLine();
if (emailNew.equals(map1.get(search).getEmail())){
System.out.println("对不起邮箱相同!不要玩我!");
}else {
map1.get(search).setEmail(emailNew);
System.out.println("修改成功!");
}
break;
default:
System.out.println("对不起没有此选项!");
}
studentSystem.FileOutPut(map1);
}
}
break;
case 6:
System.out.println("欢迎您再次使用该系统,再见!");
return;
default:
System.out.println("对不起该系统暂无此功能");
}
}
}
}
系统类
方法 | 作用 |
---|---|
StudentSystem(无参构造) | 创建本地File并创建Map对象 |
studentPackage | 在map中包装一个新的学生信息 |
Input与Output | 提供main方法对文件的调用方法(.就行了) |
contains | 判断当前系统知否存在该学生学号 |
class StudentSystem{
Map<Integer,Student> map;
File file = new File("C:\\Users\\10571\\Desktop\\java\\学生档案.txt");
public StudentSystem() {
map = new HashMap<>();
try {
if (!file.exists()){
FileOutputStream fos = new FileOutputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt"));
oos.writeObject(map);
oos.flush();
oos.close();
}else{
/*ois = new ObjectInputStream(new FileInputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt"));
Map<Integer,Student> map1 = (HashMap<Integer,Student>)ois.readObject();
*/
this.map = this.FileInPut();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void studentPackage(int no,String name, String sex, String email, String birth){
map.put(no,new Student(name,sex,email,birth));
}
public Map<Integer,Student> getMap(){
return this.map;
}
public void setMap(Map<Integer, Student> map) {
this.map = map;
}
public boolean contains(int no){
if(map.containsKey(no) || no <= 0){
return true;
}else{
return false;
}
}
public Map<Integer,Student> FileInPut(){
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt"));
Map<Integer,Student> map1 = (HashMap<Integer,Student>)ois.readObject();
ois.close();
return map1;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public void FileOutPut(Map<Integer,Student> map){
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\10571\\Desktop\\java\\学生档案.txt"));
oos.writeObject(map);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
学生对象类
class Student implements Serializable {
private String name,sex,email,birth;
public Student(String name, String sex, String email, String birth) {
this.name = name;
this.sex = sex;
this.email = email;
this.birth = birth;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
@Override
public String toString() {
return "学生姓名为:"
+ name +
", 性别为:" + sex +
", 邮箱地址为: " + email +
", 出生日期为:" + birth;
}
}
总结:在没有学习mysql数据库之前,使用这样的序列化进行模拟操作的代码量很大,很不方便,但是能够锻炼面向对象的思维并对io和序列化方法有更好的了解