读取txt文件,json文件,XML文件的学生管理系统

目录

1.题目要求

2.StudentInfo

3.txt读取

4. JSON读取

5.XML读取


1.题目要求

1)实现一个学生抽象类:StudentInfo,属性信息包括:学号studentNumber(学号唯一),姓名studentName,性别gander,生日birthday,学院academy,专业major;
2)由StudentInfo派生出三个子类,本科生UndergraduateStudent(扩展属性:辅导员tutor)、研究生GraduateStudent(扩展属性:导师supervisor)、博士生DoctoralStudent(扩展属性:导师supervisor,研究生方向researchFields);
3)本科生的信息均存放在us.txt文件中,一行表示一个学生,格式为:studentNumber_studentName_gander_birthday_academy_major_tutor,例如:
202130001_张三_男_2002年09月01日_软件学院_软件工程_张老师
202130002_李四_女_2002年10月25日_软件学院_软件工程_张老师
4)研究生的信息均存放在gs.json文件中,以JSON数组存放,例如:
[{"academy":"软件学院","birthday":"2002年08月09日","gander":"女","major":"软件工程","studentName":"李四","studentNumber":"202120001","supervisor":"李老师"},
{"academy":"软件学院","birthday":"2002年09月29日","gander":"男","major":"软件工程","studentName":"张三","studentNumber":"202120002","supervisor":"赵老师"}]
5)博士研究生的信息均存放在ds.xml文件中,以XML格式存放,例如:
<doctoralStudents>
<studentInfo>
<studentNumber>202110001</studentNumber>
<studentName>张三</studentName>
<gander>男</gander>
<birthday>2000年05月16日</birthday>
<academy>软件学院</academy>
<major>计算机科学与技术</major>
<supervisor>马老师</supervisor>
<researchFields>人工智能</researchFields>
</studentInfo>
<studentInfo>
<studentNumber>202110002</studentNumber>
<studentName>李四</studentName>
<gander>女</gander>
<birthday>2001年02月26日</birthday>
<academy>软件学院</academy>
<major>计算机科学与技术</major>
<supervisor>马老师</supervisor>
<researchFields>大型工业软件</researchFields>
</studentInfo>
</doctoralStudents>
6)程序启动后,自动加载存放与工程根目录下的这三个文件,加载并解析学生信息。
7)基于Console按下列菜单实现相关功能。
[A]打印全部学生信息 //按各类学生对应的存储格式打印所有学生的信息,即本科生按字符分割,研究生按JSON,博士生按XML
[B]新增一个本科生
[C]新增一个研究生
[D]新增一个博士生 //以上三类学生的输入格式可自行定义,但要求对应三个观察者,当新增学生时,可立即将数据写入到对应的文件中
[E]按学号查找学生 //按学号查找,并打印学生信息,格式与存储格式相同
[F]按姓名查找学生 //按姓名查找,可能有多个,按存储格式打印各学生信息
[G]学生排序 //按本科生、研究生、博士生的顺序,每类学生再按年龄从小到大进行排序,并按存储格式打印各学生信息
8)其他要求,考虑学生类别、输入输出格式可能会发生变化;考虑用户输入的合法性,避免程序异常终止。

2.StudentInfo

StudentInfo类没什么好说的,按照题目要求定义即可,此处为了便利,属性都选择protected修饰。

public abstract class StudentInfo {
    protected String studentNumber;//学号
    protected String studentName;//姓名
    protected String gander;//性別
    protected String birthday;//生日
    protected String academy;//学院
    protected String major;//专业


    public StudentInfo() {
    }

    public StudentInfo(String studentNumber, String studentName, String gander, String birthday, String academy, String major) {
        this.studentNumber = studentNumber;
        this.studentName = studentName;
        this.gander = gander;
        this.birthday = birthday;
        this.academy = academy;
        this.major = major;
    }

    @Override
    public abstract String toString();

    //Getter & Setter
}

3.txt读取

1. UndergraduateStudent类建立时覆写toString类型,便于后续写入和输出

2. String[] parts = line.split("_");//接收到的字符串按_分隔装入数组parts中

3.新增本科生时给出提示信息再接收,最后调用写入函数即可

//先定义UnderGraduateStudent类,多了一个tutor属性

public class UndergraduateStudent extends StudentInfo{
    protected String tutor; // 辅导员

    public UndergraduateStudent() {
    }

    public UndergraduateStudent(String studentNumber, String studentName, String gander, String birthday, String academy, String major, String tutor) {
        super(studentNumber, studentName, gander, birthday, academy, major);
        this.tutor = tutor;
    }
    
    //将toString方法与输出格式对应
    @Override
    public String toString() {
        return studentNumber+"_"+studentName+"_"+gander+"_"+birthday+"_"+academy+"_"+major+"_"+tutor;
    }

    //Getter & Setter
}

//IO流
//读取txt文件中的本科生信息
    public void loadUndergraduates(){
        try{
            BufferedReader br = new BufferedReader(new FileReader("resources/us.txt"));
            String line;
            while((line = br.readLine()) != null){
                //将读取到的String按 _ 分开,装入parts数组中
                String[] parts = line.split("_");
                //创建UndergraduateStudent对象
                UndergraduateStudent u = new UndergraduateStudent(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);
                //将新创建的对象装入 List<UndergraduateStudent> undergraduates
                undergraduates.add(u);
            }
            //关闭资源
            br.close();

        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //将本科生信息写入txt文件
    public void writeUndergraduatesToTxt(){
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("resources/us.txt"));
            //增强for循环
            for (UndergraduateStudent u1 : undergraduates) {
                
                //写入数据
                bw.write(u1.toString + "\n");
            }
            //关闭资源
            bw.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }


    //新增一个本科生
    public void addUndergraduate(){
        UndergraduateStudent u = new UndergraduateStudent();
        System.out.println("请输入新增本科生的信息:");
        System.out.print("studentNumber = ");
        u.setStudentNumber(scanner.nextLine());
        System.out.print("studentName = ");
        u.setStudentName(scanner.nextLine());
        System.out.print("gander = ");
        u.setGander(scanner.nextLine());
        System.out.print("birthday = ");
        u.setBirthday(scanner.nextLine());
        System.out.print("academy = ");
        u.setAcademy(scanner.nextLine());
        System.out.print("major = ");
        u.setMajor(scanner.nextLine());
        System.out.print("tutor = ");
        u.setTutor(scanner.nextLine());
        undergraduates.add(u);
        //把新增的学生信息也写入文件
        writeUndergraduatesToTxt();
    }

4. JSON读取

1. 创建GraduateStudent类

@JSONField注解

        name指定对应key值, ordinal指定序列化时的顺序

        该注解可以加在属性上面,也可以加在Getter Setter方法上面

toString方法

        直接返回对象序列化后的值便于写入和输出

   2.先将接收到的String转成JSONArray类型

JSONArray jsonArray = JSON.parseArray(jsonStr.toString());

JSONArray与List类似,JSONObject与map类似,有<key,value>

调用JSONObject的getString(key)方法来获取对应的值

//创建GraduateStudent类
public class GraduateStudent extends StudentInfo{
    @JSONField(name = "supervisor", ordinal = 7)
    protected String supervisor;

    public GraduateStudent() {}

    public GraduateStudent(String studentNumber, String studentName, String gander, String birthday, String academy, String major, String supervisor) {
        super(studentNumber, studentName, gander, birthday, academy, major);
        this.supervisor = supervisor;
    }

    @Override
    public String toString() {
        String jsonStr = JSON.toJSONString(this);
        return jsonStr;
    }

    @JSONField(name = "major", ordinal = 4)
    @Override
    public String getMajor() {return super.getMajor();}

    @JSONField(name = "major", ordinal = 4)
    @Override
    public void setMajor(String major) {super.setMajor(major);}

    @JSONField(name = "academy", ordinal = 1)
    @Override
    public void setAcademy(String academy) {super.setAcademy(academy);}

    @JSONField(name = "academy", ordinal = 1)
    @Override
    public String getAcademy() {return super.getAcademy();}

    @JSONField(name = "birthday", ordinal = 2)
    @Override
    public void setBirthday(String birthday) {super.setBirthday(birthday);}

    @JSONField(name = "birthday", ordinal = 2)
    @Override
    public String getBirthday() {return super.getBirthday();}

    @JSONField(name = "gander", ordinal = 3)
    @Override
    public void setGander(String gander) {super.setGander(gander);}

    @JSONField(name = "gander", ordinal = 3)
    @Override
    public String getGander() {return super.getGander();}

    @JSONField(name = "studentName", ordinal = 5)
    @Override
    public void setStudentName(String studentName) {super.setStudentName(studentName);}

    @JSONField(name = "studentName", ordinal = 5)
    @Override
    public String getStudentName() {return super.getStudentName();}

    @JSONField(name = "studentNumber", ordinal = 6)
    @Override
    public void setStudentNumber(String studentNumber){super.setStudentNumber(studentNumber);}

    @JSONField(name = "studentNumber", ordinal = 6)
    @Override
    public String getStudentNumber() {return super.getStudentNumber();}


    public void setSupervisor(String supervisor) {this.supervisor = supervisor;}
}

//读取json文件中的研究生信息
    public void loadGraduateStudents(){
        StringBuilder jsonStr = new StringBuilder();
        try(BufferedReader br = new BufferedReader(new FileReader("resources/gs.json"))
        ){
           //读取文本内容
                String line;
                while((line = br.readLine()) != null){
                    jsonStr.append(line);
                }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //解析JSON数组
        JSONArray jsonArray = JSON.parseArray(jsonStr.toString());

        //将JSONArray转换成List
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = (JSONObject) jsonArray.get(i);
            String academy = jsonObject.getString("academy");
            String birthday = jsonObject.getString("birthday");
            String gander = jsonObject.getString("gander");
            String major = jsonObject.getString("major");
            String studentName = jsonObject.getString("studentName");
            String studentNumber = jsonObject.getString("studentNumber");
            String supervisor = jsonObject.getString("supervisor");
            GraduateStudent graduateStudent = new GraduateStudent(studentNumber,studentName,gander,birthday,academy,major,supervisor);
            //将创建出来的对象add到List<GraduateStudent> graduateStudents
            graduateStudents.add(graduateStudent);
        }
    }


    //将研究生的信息写入json文件
    public void writeGraduateStudentsToJson(){
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("resources/gs.json"));
            String jsonOutput = JSON.toJSONString(graduateStudents);
            bw.write(jsonOutput);
            bw.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }


    //新增一个研究生
     public void addGraduateStudent();//同上

5.XML读取

public class DoctoralStudent extends StudentInfo{
    protected String supervisor;//导师
    protected String researchFields;//研究生方向

    public DoctoralStudent() {
    }

    public DoctoralStudent(String studentNumber, String studentName, String gander, String birthday, String academy, String major, String supervisor, String researchFields) {
        super(studentNumber, studentName, gander, birthday, academy, major);
        this.supervisor = supervisor;
        this.researchFields = researchFields;
    }

    @Override
    public String toString() {
        return "  <studentInfo>\n"
                + "    <studentNumber>" + studentNumber + "</studentNumber>\n"
                + "    <studentName>" + studentName + "</studentName>\n"
                + "    <gander>" + gander + "</gander>\n"
                + "    <birthday>" + birthday + "</birthday>\n"
                + "    <academy>" + academy + "</academy>\n"
                + "    <major>" + major + "</major>\n"
                + "    <supervisor>" + supervisor + "</supervisor>\n"
                + "    <researchFields>" + researchFields + "</researchFields>\n"
                + "  </studentInfo>";
    }
    
    //Getter & Setter

}


    //从xml中读取博士生数据
    public void loadDoctoralStudent(){
        try {
            //创建SAXReader对象
            SAXReader reader = new SAXReader();

            //读取XML文件
            Document document = reader.read(new File("resources/ds.xml"));

            //获取根元素
            Element root = document.getRootElement();

            //遍历根元素的子元素
            List<Element> studentInfoElements = root.elements("studentInfo");
            for(Element element : studentInfoElements){

                //获取每个DoctoralStudent元素的子元素
                //elementText 通常指的是 XML 或其他标记语言中某个元素(Element)的纯文本内容
                String studentNumber = element.elementText("studentNumber");
                String studentName = element.elementText("studentName");
                String gander = element.elementText("gander");
                String birthday = element.elementText("birthday");
                String academy = element.elementText("academy");
                String major = element.elementText("major");
                String supervisor = element.elementText("supervisor");
                String researchFields = element.elementText("researchFields");

             //创建DoctoralStudent对象并添加到List<DoctoralStudent> doctoralStudents中
                DoctoralStudent ds = new DoctoralStudent(studentNumber,studentName,gander,birthday,academy,major,supervisor,researchFields);
                doctoralStudents.add(ds);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //将信息写入XML中
    public void writeDoctoralStudentsToXml() {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("resources/ds.xml"));
            String xmlString = toXmlString();
            bw.write(xmlString);
            bw.close();
        }catch (IOException e){
            e.printStackTrace();
        }

}

    //将List<DoctoralStudent> doctoralStudents转换成XML格式的字符串
    public String toXmlString(){
        StringBuilder xml = new StringBuilder();
        xml.append("<doctoralStudents>\n");
        for (DoctoralStudent ds : doctoralStudents) {
            xml.append(ds.toString()).append("\n");

        }
        xml.append("</doctoralStudents>");
        return xml.toString();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值