学生管理系统(IO流实现数据存储)
·
知识点:Javase
实现功能:增删改查,数据存储
代码解析:
-
程序入口
public static void main(String[] args) throws IOException {
//通过IO流从本地文件中读取数据,数据类型为Student类的集合
ArrayList<Student> students = input();
// ArrayList<Student> students = new ArrayList<>();
//相比于第一版,把循环写成了菜单栏方法
mainStudent(students);
}
-
菜单方法
public static void mainStudent(ArrayList<Student> students) throws IOException {
//无限循环,实现每次循环后都执行菜单方法
while (true) {
System.out.println();
System.out.println("-------------------------------");
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.println("6.根据姓名关键字查询学生");
System.out.println("7.退出系统");
System.out.println("--------------------------------");
Scanner scanner = new Scanner(System.in);
//choice为接收选择的选项
Integer choice = scanner.nextInt();
//通过switch决定执行方法,功能还是和第一版一样由静态方法实现
switch (choice) {
case 1:
displayAllStudents(students);
break;
case 2:
addStudent(students);
break;
case 3:
setStudent(students);
break;
case 4:
deleteStudent(students);
break;
case 5:
byStudentNumFind(students);
break;
case 6:
byNameFind(students);
break;
case 7:
//退出系统选项,正常退出系统才保存修改的数据到文件内
output(students);
//system退出系统的默认代码
System.exit(0);
break;
default:
}
}
}
-
展示所有学生信息
public static void displayAllStudents(ArrayList<Student> students) {//局部变量为ArrayList的泛型类,泛型为Student类
boolean flag = true;//用于判断集合是否为空
//使用集合自带的方法循环整个集合
for (Student student : students) {
//在student类里重写了toString方法
System.out.println(student.toString());
System.out.println("------------------------------");
flag = false;//若集合为空,则flag的值不改变
}
if (flag) {//当集合为空时输出“暂无数据”
System.out.println("暂无数据");
return;
}
System.out.println("展示完毕");
}
-
增加学生
public static void addStudent(ArrayList<Student> students) throws IOException {
//由于输入学生信息重复使用,所以被封装成了函数,返回值为Student类
Student student = scannerStudent(students);
if (student==null){
System.out.println("添加失败");//为null则添加失败
return;
//因为返回的Student类可能为空值,所以要进行判断,为null直接退出增加方法
}
//直接使用list的add()方法,添加Student类至集合
students.add(student);
System.out.println("添加成功");
}
-
修改学生信息
public static void setStudent(ArrayList<Student> students) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.printf("请输入需要修改的学生的学号:");
Integer studentNum = scanner.nextInt();
boolean flag = true;//判断是否找到学号,默认没找到学号
for (Student student : students) {
//通过比较学号,找到需要修改的学号,执行修改操作
if (student.getStudentNum()==studentNum) {
//同样的,先获取修改后的student类,同时判断是否为null
Student studentNew = scannerStudent(students);
if (studentNew==null){
System.out.println("修改失败");
break;
}
//从修改后的Student类中取出年龄,姓名,性别,修改原来的Student类
student.setAge(studentNew.getAge());
student.setName(studentNew.getName());
student.setSex(studentNew.getSex());
flag = false;//执行完修改操作后,改变flag的值
}
}
//未找到学号,则flag值为默认值false,执行if语句
if (flag) {
System.out.println("未找到学号");
return;
}
System.out.println("修改完成");
}
-
输入学生信息
public static Student scannerStudent(ArrayList<Student> students) throws IOException {
//需要输入ArrayList<Student>集合,输出值为Student类
try {
Scanner scanner = new Scanner(System.in);
System.out.printf("请输入学号:");
Integer studentNum = scanner.nextInt();
System.out.printf("请输入姓名:");
String name = scanner.next();
System.out.printf("请输入年龄:");
Integer age = scanner.nextInt();
System.out.printf("请输入性别:");
String sex = scanner.next();
//new一个新的Student类返回
return new Student(studentNum, name, age, sex);
}catch (Exception e){
System.out.println("输入错误,返回菜单栏");
mainStudent(students);
}finally {
return null;
}
}
-
删除学生信息
public static void deleteStudent(ArrayList<Student> students) {
Scanner scanner = new Scanner(System.in);
System.out.printf("请输入学号:");
//删除操作与第一版一致,但加入了异常捕获,出现异常直接返回菜单
Integer studentNum = null;
try {
studentNum =scanner.nextInt();
} catch (Exception e) {
System.out.println("输入错误");
return;
}
boolean flag = true;
for (Student student : students) {
if (student.getStudentNum()==studentNum ) {
students.remove(student);
flag = false;
break;
}
}
if (flag) {
System.out.println("未找到学号");
return;
}
System.out.println("删除成功");
}
-
通过学号查找学生
public static void byStudentNumFind(ArrayList<Student> students) {
//流程上与修改操作一致,展示学生方法也介绍过了
Scanner scanner = new Scanner(System.in);
System.out.printf("请输入学号:");
//依旧要捕获异常
Integer studentNum = null;
try {
studentNum =scanner.nextInt();
} catch (Exception e) {
System.out.println("输入错误");
return;
}
boolean flag = true;
for (Student student : students) {
if (student.getStudentNum()==studentNum) {
System.out.println(student.toString());
flag = false;
}
}
if (flag) {
System.out.println("未找到学号");
return;
}
System.out.println("查找完成");
}
-
通过姓名关键字查找
public static void byNameFind(ArrayList<Student> students) {
//流程上与修改操作一致,只是使用了String类的contain方法,第一版也介绍了contain方法
Scanner scanner = new Scanner(System.in);
System.out.printf("请输入姓名关键字:");
//String类不用捕获异常
String nameImport = scanner.next();
boolean flag = true;
for (Student student : students) {
if (student.getName().contains(nameImport)) {
System.out.println(student.toString());
flag = false;
}
}
if (flag) {
System.out.println("未找到学号");
return;
}
System.out.println("查找完成");
}
-
从文件中获取数据
public static ArrayList<Student> input() throws IOException {
//ObjectInputStream类和ArrayList<Student>需要捕获异常
ObjectInputStream objectInputStream=null;
ArrayList<Student> students=null;
try {
//从路径中提取信息创造ObjectInputStream对象,ObjectInputStream不能直接使用,所以通过FileInputStream对象间接使用
objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
//使用ObjectInputStream类封装好的readObject(),读取文件中的object类,在强制转化为ArrayList<Student>
students = (ArrayList<Student>) objectInputStream.readObject();
// System.out.println("数据载入成功");
} catch (EOFException e) {
// System.out.println(11111111);
// e.printStackTrace();
//初始文件为空,且students的初始值为null所以会出现这个错误,此时要给students赋值一个新的对象
students = new ArrayList<>();
}catch (Exception e) {
e.printStackTrace();
System.out.println("数据载入失败");
} finally {
//最后,如果objectInputStream,不为空,要关闭文件输入流,保存数据到idea的系统缓存区
if(objectInputStream != null) {
objectInputStream.close();
}
//返回值为students,一个集合
return students;
}
-
将idea中修改的数据存入文件
public static void output(ArrayList<Student> students) throws IOException {
//ObjectOutputStream类需要捕获异常,初始赋null值(空值)
ObjectOutputStream outputStream=null;
try {
//创建一个文件输出类对象,与ObjectInputStream类一样,不能直接使用,需要创建一个FileOutputStream对象,才能将数据输出到路径文件中
outputStream=new ObjectOutputStream(new FileOutputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
//利用封装好的方法writeObject(),直接将集合存入文件
outputStream.writeObject(students);
System.out.println("数据已经保存");
}catch (IOException e){
System.out.println("保存数据发生错误");
}finally {
//ObjectInputStream类不需要考验空值问题
outputStream.close();
}
}
不足:
-
真实环境中,不使用Scanner类来输入
-
系统没有部署到服务器上
升级方向:
-
利用Javaweb技术将系统部署到本地服务器上
-
接收并处理前端传入后端的数据
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)