/* Эта программа сериализует студентов. * Если файл существует, программа загружает его. * В противном случае он создает новый список классов. * Студенческие объекты добавляются в список классов, а затем сохраняются */Это часть задания, однако я никогда раньше не использовал 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)
Это утверждение:
ObjectOutputStream objectOS = new ObjectOutputStream(new
FileOutputStream("ClassList.data"));
... перезаписывает существующий файл с пустым файлом. Затем вы пытаетесь прочитать объект из этого пустого файла.
Сначала вы должны прочитать, а затем открыть файл для вывода.
Я бы действительно разорвал этот код на отдельные методы:
Также обратите внимание:
if (found = true)
не делает то, что вы хотите. Он будет назначаться, чтобы found
, а затем всегда выполнять тело блока if
. Вы хотите:
if (found == true)
или еще лучше
if (found)