目录
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();
}