知识点: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技术将系统部署到本地服务器上

  • 接收并处理前端传入后端的数据

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐