先是要写一个方法叫做saveStudent,可以从别的地方接受输入Student类型对象的数组(包含学生信息之类的),然后会将每一个输入的学生信息逐条写进一个.dat二进制文件里,然后再写一个没有参数的loadStudent方法,可以从刚才的.dat文件里恢复Student类型的对象,返回数组。请问这个题应该怎么做啊?搞了半天没搞懂,有点看不懂是不是要先写一个从别的地方接收这个数组的方法啊?谢谢了!!!
调试欢乐多
import java.io.Serializable;import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.file.Files;
import static java.nio.file.StandardOpenOption.*;import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.EOFException;import java.util.ArrayList;public class Test{
public static void main(String[] args){
//多次运行代码,结果会不一样.
Student[] students = new Student[3];
students[0] = new Student("张三","男",19);
students[1] = new Student("李四","男",20);
students[2] = new Student("王五","男",21);
SerialTool.saveStudent(students);
Student[] result = SerialTool.loadStudent(); for(Student student : result){
System.out.println(student);
}
}
}class SerialTool{
public static void saveStudent(Student[] students){
if(!Files.exists(path)){
try{
Files.createFile(path);
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}
}
//执行到这里已经确保文件是存在的.
//首次文件为空,后续随着不断的序列化对象文件会逐步增大
try(OutputStream out = Files.newOutputStream(path,WRITE,APPEND)){
//文件可写属性/追加属性
ObjectOutputStream output = null; if(Files.size(path) > 0){
output = new MyObjectOutputStream(out);
}else{
output = new ObjectOutputStream(out);
}
for(Student student : students){
output.writeObject(student);
}
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}
} public static Student[] loadStudent(){
ArrayList<Student> result = new ArrayList<>();
if(!Files.exists(path)){
return result.toArray(new Student[0]);
}
try(ObjectInputStream input = new ObjectInputStream(
Files.newInputStream(path,READ));){
Student student = null; while(true){
student = (Student)(input.readObject());
result.add(student);
}
}catch(EOFException e){
//get here
//当到达文件末端时候返回.
return result.toArray(new Student[0]);
}catch(IOException|ClassNotFoundException e){
e.printStackTrace();
System.exit(1);
} //can't get here
assert false; return null;
} private static final Path path = Paths.get("data.bin");
}class MyObjectOutputStream extends ObjectOutputStream{
//由于需要将对象在多次程序运行的时候写入到文件,而不是覆盖.
//所以这里需要重写自己的ObjectOutputStream对象.
protected MyObjectOutputStream()throws IOException{
super();
} protected MyObjectOutputStream(OutputStream out)throws IOException{
super(out);
} @Override
protected void writeStreamHeader() throws IOException{
//这里头部写入不需要执行任何代码
}
}class Student implements Serializable{
//实现Student类.实现可序列化.
private static final long serialVersionUID = 1L; public Student(){
//default constructor
} public Student(String name,String sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
} public void setName(String name){
this.name = name;
} public void setSex(String sex){
this.sex = sex;
} public void setAge(int age){
this.age = age;
} public String toString(){
return String.format("[name:%s,sex:%s,age:%d]",name,sex,age);
}
private String name;
private int age;
private String sex;
}
需要注意的是对象对象的类型需要序列化,还有深浅copy的问题。