1、创建Student实体类,注意Student实体类需要实现Serializable, Comparable这两个接口,Serializable接口没有任何重写的方法,继承的目的是标志该类的对象是可以序列化和反序列化的。Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。
compareTo方法的返回值是int,有三种情况:
(1)比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
(2)比较者等于被比较者,那么返回0
(3)比较者小于被比较者,那么返回负整数
import java.io.Serializable; public class Student implements Serializable, Comparable{ private String name;//姓名 private String studentID;//学号 private int English;//英语成绩 private int Java;//Java成绩 private int Python;//Python成绩 //构造方法 public Student(String name, String studentID, int english, int java, int python) { this.name = name; this.studentID = studentID; English = english; Java = java; Python = python; } public void setName(String name) { this.name = name; } public void setStudentID(String studentID) { this.studentID = studentID; } public void setEnglish(int english) { English = english; } public void setJava(int java) { Java = java; } public void setPython(int python) { Python = python; } public String getName() { return name; } public String getStudentID() { return studentID; } public int getEnglish() { return English; } public int getJava() { return Java; } public int getPython() { return Python; } @Override public int compareTo(Student o) { return this.getJava() - o.getJava();//按照java成绩从小到大 } @Override public String toString() { return "Student{" + "name='" + name + ''' + ", studentID='" + studentID + ''' + ", English=" + English + ", Java=" + Java + ", Python=" + Python + '}'; } }
2、创建一个容器,将5位同学的相关信息加入到容器中。
ArrayListarrayList = new ArrayList (); //将5个学生对象添加到容器中 arrayList.add(new Student("李一", "201916001", 80, 88, 90)); arrayList.add(new Student("李二", "201916002", 54, 80, 75)); arrayList.add(new Student("李三", "201916003", 47, 69, 70)); arrayList.add(new Student("李四", "201916004", 87, 93, 60)); arrayList.add(new Student("李五", "201916005", 75, 72, 88));
3、将学生原始信息写入磁盘文件,在D盘下建立score.txt文件,这里使用ObjectOutputStream对象输出流进行存储(对象序列化)。ObjectOutputStream对象obs调用writeObjecct(arrayList)方法,将参数(对象)写入到文件。
try {
//创建一个ObjectOutputStream对象输出流
ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream("D:\score.txt"));
//将容器内对象写到文件中
obs.writeObject(arrayList);
obs.flush();
System.out.println("文件写入成功,序列化完毕!");
} catch (IOException e) {
e.printStackTrace();
}
2 读取上述原始成绩文件,按照某门课程分数高低排序
在Student实体类继承了Comparable下重写排序方法,compareTo(),这样可以直接使用Collections的sort()方法对对象内容进行排序。
Collections.sort(arrayList);
排序后输出到屏幕上,遍历arrayList容器即可,这里使用两种方法,第一种是增强for循环,第二种使用的是使用Java迭代器Iterator
//第一种遍历
for (Student student : arrayList
) {
System.out.println(student);
}
//第二种遍历
Iterator it = arrayList.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s);
}
打印在屏幕上完成后,再次将排好序的信息存入到新的文件地址re_score.txt中。同理这里使用ObjectOutputStream对象输出流进行存储(对象序列化)。ObjectOutputStream对象obs调用writeObjecct(arrayList)方法,将参数(对象)写入到文件。
try {//将排好序的容器里的对象再次写到文件中
//创建一个ObjectOutputStream对象输出流
ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream("D:\re_score.txt"));
//将容器内对象写到文件中
obs.writeObject(arrayList);
obs.flush();
System.out.println("学生信息排序后再次写入新文件re_score.txt,写入成功n");
} catch (IOException e) {
e.printStackTrace();
}
3 输出排序后的新文件,并在屏幕上显示某门课挂科详情
将D:re_score.txt文件中排好序的信息读取出来,这里使用ObjectInputStream对象输入流,从ObjectInputStream对象输入流中读取一个对象,并强制转换成ArrayList类型。输出到屏幕上并统计某门课的挂科情况。
try {//将排好序的文件内容读出来,打印到屏幕上
//创建一个ObjectInputStream对象输入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\re_score.txt"));
//从ObjectInputStream对象输入流中读取一个对象,并强制转换成ArrayList类型
ArrayList arrayList1 = (ArrayList) in.readObject();
System.out.println("re_score.txt文件内容中,Java成绩不及格的情况如下:");
Iterator iterator = arrayList1.iterator();
while (iterator.hasNext()) {
Student s = (Student) iterator.next();
if (s.getJava() < 60){
System.out.println(s);
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
4 完整代码
Student.java
package Student; import java.io.Serializable; public class Student implements Serializable, Comparable{ private String name;//姓名 private String studentID;//学号 private int English;//英语成绩 private int Java;//Java成绩 private int Python;//Python成绩 //构造方法 public Student(String name, String studentID, int english, int java, int python) { this.name = name; this.studentID = studentID; English = english; Java = java; Python = python; } public void setName(String name) { this.name = name; } public void setStudentID(String studentID) { this.studentID = studentID; } public void setEnglish(int english) { English = english; } public void setJava(int java) { Java = java; } public void setPython(int python) { Python = python; } public String getName() { return name; } public String getStudentID() { return studentID; } public int getEnglish() { return English; } public int getJava() { return Java; } public int getPython() { return Python; } @Override public int compareTo(Student o) { return this.getJava() - o.getJava();//按照java成绩从小到大 } @Override public String toString() { return "Student{" + "name='" + name + ''' + ", studentID='" + studentID + ''' + ", English=" + English + ", Java=" + Java + ", Python=" + Python + '}'; } }
Test.java
package Student;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
//将5个学生对象添加到容器中
arrayList.add(new Student("李一", "201916001", 80, 59, 90));
arrayList.add(new Student("李二", "201916002", 54, 10, 75));
arrayList.add(new Student("李三", "201916003", 47, 69, 70));
arrayList.add(new Student("李四", "201916004", 87, 93, 60));
arrayList.add(new Student("李五", "201916005", 75, 72, 88));
try {
//创建一个ObjectOutputStream对象输出流
ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream("D:\score.txt"));
// 将容器内对象写到文件中
obs.writeObject(arrayList);
obs.flush();
System.out.println("文件写入成功,序列化完毕!n");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("D:\score.txt中文件内容为:");
// 第一种遍历方法
// for (Student student : arrayList
// ) {
// System.out.println(student);
// }
//第二种遍历方法
Iterator it = arrayList.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s);
}
//排序
Collections.sort(arrayList);
System.out.println("n按照Java成绩从小到大排序为:");
for (Student student : arrayList
) {
System.out.println(student);
}
try {//将排好序的容器里的对象再次写到文件中
//创建一个ObjectOutputStream对象输出流
ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream("D:\re_score.txt"));
// 将容器内对象写到文件中
obs.writeObject(arrayList);
obs.flush();
System.out.println("学生信息排序后再次写入新文件re_score.txt,写入成功n");
} catch (IOException e) {
e.printStackTrace();
}
try {//将排好序的文件内容读出来,打印到屏幕上
//创建一个ObjectInputStream对象输入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\re_score.txt"));
//从ObjectInputStream对象输入流中读取一个对象,并强制转换成ArrayList类型
ArrayList arrayList1 = (ArrayList) in.readObject();
System.out.println("re_score.txt文件内容中,Java成绩不及格的情况如下:");
Iterator iterator = arrayList1.iterator();
while (iterator.hasNext()) {
Student s = (Student) iterator.next();
if (s.getJava() < 60){
System.out.println(s);
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果为:



