EOFException чтение UTF из двоичного файла, базы данных студентов

У меня есть много проблем с чтением двоичных значений из моей проблемы с базой данных студентов. После некоторых манипуляций я получил выход, чтобы работать правильно и в формате, я хотел, т. е.( int id, имя строки, int age) однако, у меня есть много проблем с загрузкой закодированных двоичных значений данных из моего файла. Согласно компилятору, он читает весь путь до значения UTF, затем я получаю исключение EOFException.

Вот проблема, которую я пытаюсь завершить:

Во-первых, после запуска программы, пользователь выбирает вариант либо
1. Добавление студента в базу данных
2. Удаление учащегося из базы данных
3. Печать конкретного учащегося в базе данных
4. Печать всех учащихся в базе данных

Если они выберут, пользователь добавит объект Student в вектор students.
Объект student содержит идентификатор (int), имя(String) и возраст (int).

Удаление учащегося удаляет их из вектора на основе идентификатора, введенного пользователем.

И варианты 3/4 печатают студента obj(s) к экрану сами (не к бинарному файлу)

После выхода пользователя из программы путем ввода 5; студенческие объекты в векторе записываются в двоичный файл.

И когда программа будет повторно запущена, она загрузит студенческий объект обратно в вектор. (Remeber файл был записан и загружен из двоичного файла)

Проблема у меня есть, что, когда файл «студент.данные » (файл, который я в настоящее время пишу) загружается он продолжает бросать мне EOFException в строке 198, когда я пытаюсь прочитать имя студента.

Я считаю, что проблема может быть, когда я пишу код, но я изменил способ, которым я хватаю значения имен и пишу их несколько раз, я все еще не был в состоянии загрузить их должным образом.

Есть предложения по устранению этой проблемы?

Код:

//StudentDB.java
import java.util.Vector;
import java.io.*;
import java.util.Scanner;
class Student
{
    private int id;
    private String name;
    private int age;
    //Desc: Initializes the student to id=0, name="none", and age=0
    public Student()
    {
        this.id=0;
        this.name="none";
        this.age=0;
    }
    //Desc: Initializes the student to id=i, name=n, age=a
    public Student(int I, String n, int a)
    {
        this.id=I;
        this.name=n;
        this.age=a;
    }
    //Desc: Sets the current id to s
    public void setID(int s)
    {
        this.id=s;
    }
    //Return: The current ID value
    public int getID()
    {
        return this.id;
    }
    //Desc: sets the current name of the student to s
    public void setName(String s)
    {
        this.name=s;
    }
    //Return: The current name of the student
    public String getName()
    {
        return this.name;
    }
    //Desc: sets the current age of the obj to a
    public void setAge(int a)
    {
        this.age=a;
    }
    //Return: The students current age
    public int getAge()
    {
        return this.age;
    }
    //Return: True if id of this student equals id of obj, false otherwise
    public boolean equals(Object obj)
    {
        Student stu= (Student)obj;
        if(this.id==stu.id) return true;
        else return false;
    }
    //Desc: Compares two students based on their ID to determine if they're
    // the same
    //Return: 1  if the current Student's ID is greater than stu
    //      0 if the students ID's are the same
    //      -1 if Student stu's ID is larger
    public int compareTo(Student stu)
    {
        if(this.id> stu.id) return 1;

        else if(this.id==stu.id) return 0;

        else return -1;

    }
    //Return: id+"Name"+age
    public String toString()
    {
            return (this.getID()+ " "+this.getName()+" "+this.getAge());
    }
}
public class StudentDB
{
    private static Scanner keyboard=new Scanner(System.in);
    //Desc: Maintains a database of Student Records. The database is stored in
    // a binary file called "Student.data"
    //Input: User enters commands from keyboard to manipulate database
    //Output: Database updated as directed by user.
    public static void main(String[]args) throws IOException
    {
        Vector<Student> v= new Vector<Student>();
        File s= new File("Student.data");
        if(s.exists()) loadStudent(v);
        int choice=5;
        do
        {
            System.out.println("t1. Add a Student Record");
            System.out.println("t2. Remove a Student Record");
            System.out.println("t3. Print a Student Record");
            System.out.println("t4. Print all Student Records");
            System.out.println("t5. Quit");
            choice= keyboard.nextInt();
            keyboard.nextLine();
            switch(choice)
            {
                case 1: addStudent(v); break;
                case 2: removeStudent(v); break;
                case 3: printStudent(v); break;
                case 4: printAllStudent(v); break;
                default: break;
            }
        } while(choice!=5);
        storeStudent(v);
    }
    //Input: user enters an integer(id), a string(name), an integer(age) from
    //the keyboard all on seperate lines
    //Post: The input record added to v if id does not exist
    //Output: various prompts as well as "Student Added" or "Add failed:
    // Student already exists" printed on the screen accordingly
    public static void addStudent(Vector<Student> v)
    {
        Student stu= new Student();

        System.out.print("Please enter a Student ID:");
        stu.setID(keyboard.nextInt());
        keyboard.nextLine();

        System.out.print("Please enter a Student Name:");
        stu.setName(keyboard.nextLine());

        System.out.print("Please enter a Student Age:");
        stu.setAge(keyboard.nextInt());
        keyboard.nextLine();

        int index= v.indexOf(stu);
        if(index==-1)
        {
            v.add(stu);
            System.out.println("Student Added");
        }
        else System.out.println("Add failed: Student already exists");

    }
    //Input: user enters an integer(id) from the Keyboard
    //Post: The records in v whose id field matches the input removed from v
    //Output: various prompts as well as "Student removed" or "Remove failed:
    // Student does not exsist" printed on the screen accordingly
    public static void removeStudent(Vector<Student>v)
    {
        System.out.print("Student ID:");
        int id= keyboard.nextInt();
        Student stu= new Student(id,"",99);
        if(v.remove(stu))   System.out.println("Student Removed");
        else System.out.println("Remove Failed");
    }
    //Input: user enters an integer(id) from the Keyboard
    //Output: various prompts as well as the record in v whose id field 
    // matches the input printed on the screen or "Print failed: Student
    // does not exsist" printed on the screen accordingly
    public static void printStudent(Vector<Student>v)
    {
        System.out.print("Student ID:");
        int id= keyboard.nextInt();
        Student stu= new Student(id,"",99);
        int index=v.indexOf(stu);
        if(index!=-1)
        {
            System.out.println(v.get(index).toString());
        }
        else System.out.println("Print failed: Student does not exsist!");
    }
    //Output: All records in v printed on the screen 
    public static void printAllStudent(Vector<Student>v)
    {
        Student stu=new Student();
        for(int i=0; i<v.size();++i)
        {
            stu=v.get(i);
            System.out.println(stu);
        }

    }
    //Input: Binary file Student.data must exist and contains student records
    //Post: All records in Student.data loaded into vector v.
    public static void loadStudent(Vector<Student>v)throws IOException
    {
        Student stu;
        int c;
        DataInputStream f= new DataInputStream(
                new FileInputStream("Student.data"));
       try {
           while(true)
           {
               stu=new Student();
               int id=f.readInt();
               stu.setID(id);
               String name= f.readUTF();
               stu.setName(name);
               int age= f.readInt();
               stu.setAge(age);
               v.add(stu);
           }
       }
       catch(EOFException e)
       {
           System.out.println("Error!: End of File Exception");
           f.close();
       }
       catch(IOException e)
       {
           System.out.println("Error Reading File");
           f.close();
           System.exit(1);
       }
        f.close();
    }
    //Output: All records in v written to binary file Student.data
    public static void storeStudent(Vector<Student>v) throws IOException
    {
        Student stu= new Student();
        DataOutputStream s= new DataOutputStream(
                new FileOutputStream("Student.data"));
        for(int i=0; i<v.size(); ++i)
        {
            stu=v.get(i);
            s.writeInt(stu.getID());
            s.writeUTF(stu.getName());
            s.writeInt(stu.getAge());
        }
        s.close();
    }
}

1 ответ

  1. Две причины в том, что он ломается.

    1. У вас есть бесконечное чтение
    2. Вы добавляете каждого студента к той же строке

    внесите следующие изменения

    loadStudent изменить white(true)while(f.available() > 0)и добавить f.readChar();в конце.

    public static void loadStudent(Vector<Student>v)throws IOException
    {
        Student stu;
        int c;
        DataInputStream f= new DataInputStream(
                new FileInputStream("Student.data"));
       try {
           // CHANGE HERE IS IMPORTANT
           while(f.available() > 0)
           {
               stu=new Student();
               int id=f.readInt();
    
               stu.setID(id);
               String name= f.readUTF();
               stu.setName(name);
               int age= f.readInt();
               stu.setAge(age);
               v.add(stu);
               // This read char is important since it's one user per line.
               f.readChar();
           }
       }
       catch(EOFException e)
       {
           System.out.println("Error!: End of File Exception");
           f.close();
       }
       catch(IOException e)
       {
           System.out.println("Error Reading File");
           f.close();
           System.exit(1);
       }
        f.close();
    }
    

    storeStudent при сохранении студентов добавьте новый символ строки в конце. s.writeChar('\n');

    public static void storeStudent(Vector<Student>v) throws IOException
    {
        Student stu= new Student();
        DataOutputStream s= new DataOutputStream(
                new FileOutputStream("Student.data"));
        for(int i=0; i<v.size(); ++i)
        {
            stu=v.get(i);
            s.writeInt(stu.getID());
            s.writeUTF(stu.getName());
            s.writeInt(stu.getAge());
            // One user per line
            s.writeChar('\n');
            }
        s.close();
    }