先是要写一个方法叫做saveStudent,可以从别的地方接受输入Student类型对象的数组(包含学生信息之类的),然后会将每一个输入的学生信息逐条写进一个.dat二进制文件里,然后再写一个没有参数的loadStudent方法,可以从刚才的.dat文件里恢复Student类型的对象,返回数组。请问这个题应该怎么做啊?搞了半天没搞懂,有点看不懂是不是要先写一个从别的地方接收这个数组的方法啊?谢谢了!!!

解决方案 »

  1.   


    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;
    }
      

  2.   

    1楼的答案应该是对的,思路就是用JAVA的对象流去写入文件,然后出读出整个对象出来。
    需要注意的是对象对象的类型需要序列化,还有深浅copy的问题。