Использование ObjectWriter. Дает мне EOF Exception, хотя я закрываю файл.

1

/* Эта программа сериализует студентов. * Если файл существует, программа загружает его. * В противном случае он создает новый список классов. * Студенческие объекты добавляются в список классов, а затем сохраняются */Это часть задания, однако я никогда раньше не использовал objectWriter.

import java.util.Scanner; 
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.lang.ClassNotFoundException;
import java.util.List;
import java.util.ArrayList;
import java.io.EOFException;

public class ClassList{

 public static void find(int sN, String fN, String lN){
    boolean found = false;

    try{
    ObjectOutputStream objectOS = new ObjectOutputStream(new FileOutputStream("ClassList.data"));
        ObjectInputStream objectIS = new ObjectInputStream(new FileInputStream("ClassList.data"));
        int i=0;
        Assignment readAssign = (Assignment) objectIS.readObject();
    Student studentRead = readAssign.getStudents().get(i);

        /*Search the student objects & compare student number.
         *If found, boolean returns true, else the boolean is false
         */ 
        while (readAssign.getStudents() != null){
             studentRead = readAssign.getStudents().get(i);
             if (studentRead.getID() == sN){
                  found = true;
                  break;
             }
             i++;
        }

        /*If the boolean found is true error message is produced
         *If the boolean found is false then it adds a new Student object
         */
        if (found = true){
             System.out.println("A student with this id number already exists by the name:");
             System.out.print(studentRead.getFName() + " " + studentRead.getLName());
         objectOS.flush();
     objectOS.close();
        }
        else{
             Student student = new Student();
             student.setFName(fN);
             student.setLName(lN);
             student.setID(sN);
             Assignment assign = new Assignment();
     List<Student> students = new ArrayList<>();
     students.add(student);
     assign.setStudents(students);
             System.out.println("Done");
             objectOS.writeObject(assign);
         objectOS.flush();
     objectOS.close();


        }

    }
    catch(ClassNotFoundException cnf){
     cnf.printStackTrace();
}
    catch(FileNotFoundException fnf){
     fnf.printStackTrace();
}
catch(EOFException of) {
     eof.printStackTrace();
}
    catch(IOException ioe) {
     //ioe.printStackTrace();
}

 }



  public static void main(String args[]){
        Scanner stuIn = new Scanner(System.in);

        //Use student Input to create students
        System.out.println("What is your first name: ");
        String fName = stuIn.nextLine();

        System.out.println("What is your last name: ");
        String lName = stuIn.nextLine();

        System.out.println("What is your student number: ");
        int sNum = stuIn.nextInt();

        find(sNum, fName, lName);

 }


}

Сообщение об ошибке:

java.io.EOFException в java.io.ObjectInputStream $ BlockDataInputStream.peekByte(ObjectInputStream.java:2601) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1319) в java.io.ObjectInputStream.readObject(ObjectInputStream.java: 371) в ClassList.find(ClassList.java:28) в ClassList.main(ClassList.java:100)

Теги:

1 ответ

1
Лучший ответ

Это утверждение:

ObjectOutputStream objectOS = new ObjectOutputStream(new 
    FileOutputStream("ClassList.data"));

... перезаписывает существующий файл с пустым файлом. Затем вы пытаетесь прочитать объект из этого пустого файла.

Сначала вы должны прочитать, а затем открыть файл для вывода.

Я бы действительно разорвал этот код на отдельные методы:

  • Чтение задания (открытие, чтение, закрытие)
  • Назначение процесса (без ввода-вывода)
  • Записать назначение (открыть, писать, закрыть)

Также обратите внимание:

if (found = true)

не делает то, что вы хотите. Он будет назначаться, чтобы found, а затем всегда выполнять тело блока if. Вы хотите:

if (found == true)

или еще лучше

if (found)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню