Question

I'm using random access files to write a raf using an arrayList store. I do not know if it can be done, but I'm giving it a try because it is the best solution for me to create this application.

Here is the run-time error that I am getting:

Exception in thread "main" java.io.EOFException
at java.io.RandomAccessFile.readChar(Unknown Source)
at Student.read(Student.java:93)
at MainApp.start(MainApp.java:60)
at MainApp.main(MainApp.java:17)

And here is my code:

MainApp
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.RandomAccessFile;


public class MainApp
{

    public static void main(String[] args) throws Exception 
    {
        new MainApp().start();

    }
    public void start()throws Exception 
    {
        StudentStore details = new StudentStore();
        //Student a = new Student("Becky O'Brien", "DKIT26", "0876126944", "bexo@hotmail.com");




        //details.print();



         RandomAccessFile raf = new RandomAccessFile("ContactDetails.txt", "rw");

         Student a = new Student("Becky O'Brien", "DKIT26", "0876126944", "bexo@hotmail.com");
         Student b = new Student("Fabio Borini", "DKIT28", "0876136944", "fabioborini@gmail.com");
         Student c = new Student("Gaston Ramirez", "DKIT29", "0419834501", "gramirez@webmail.com");
         Student d = new Student("Luis Suarez", "DKIT7", "0868989878", "luissuarez@yahoo.com");
         Student e = new Student("Andy Carroll", "DKIT9", "0853456788", "carroll123@hotmail.com");
         details.add(a);
         details.add(b);
         details.add(c);
         details.add(d);
         details.add(e);
            for (int i = 0; i < details.size(); i++) 
            {
              //a.setStudentName(a[i]);
              //a.setLastName(lnames[i]);
             // a.setAddress(addresses[i]);
             // a.setAge(ages[i]);
             // a.setSalary(salaries[i]);
              a.write(raf);
            }
            raf = new RandomAccessFile("employee.dat", "rw");

           // er = new Student();

            int numRecords = (int) raf.length() / details.size();

            for (int i = 0; i < numRecords; i++) {
              a.read(raf);

              System.out.print(a.getStudentName() + " ");
              System.out.print(a.getStudentId() + " ");
              System.out.print(a.getStudentEmail() + " ");
              System.out.print(a.getStudentTelephoneNumber() + " ");
            }
            raf.seek(0);
            for (int i = 0; i < numRecords; i++) 
            {
              a.read(raf);
                raf.seek(raf.getFilePointer() - details.size());
                a.write(raf);
                raf.seek(raf.getFilePointer() - details.size());
                a.read(raf);
              }
              System.out.print(a.getStudentName() + " ");
              System.out.print(a.getStudentId() + " ");
              System.out.print(a.getStudentEmail() + " ");
              System.out.print(a.getStudentTelephoneNumber() + " ");
            }

          }

Student

import java.io.IOException;
import java.io.RandomAccessFile;


public class Student 
{
//---------------------------------------------------------------------------
//  Class Variables.
//---------------------------------------------------------------------------   
    private String studentName;
    private String studentId;
    private String studentTelephoneNumber;
    private String studentEmail;
//---------------------------------------------------------------------------
//  Constructor.
//---------------------------------------------------------------------------   
    public Student(String studentName, String studentId,String studentTelephoneNumber, String studentEmail) 
    {
        this.studentName = studentName;
        this.studentId = studentId;
        this.studentTelephoneNumber = studentTelephoneNumber;
        this.studentEmail = studentEmail;
    }
//---------------------------------------------------------------------------
//  Getters.
//---------------------------------------------------------------------------
    public String getStudentName()
    {
        return studentName;
    }
    public String getStudentId() 
    {
        return studentId;
    }
    public String getStudentTelephoneNumber() 
    {
        return studentTelephoneNumber;
    }
    public String getStudentEmail() 
    {
        return studentEmail;
    }
//---------------------------------------------------------------------------
//  Setters.
//---------------------------------------------------------------------------
    public void setStudentName(String studentName) 
    {
        this.studentName = studentName;
    }
    public void setStudentId(String studentId) 
    {
        this.studentId = studentId;
    }
    public void setStudentTelephoneNumber(String studentTelephoneNumber) 
    {
        this.studentTelephoneNumber = studentTelephoneNumber;
    }
    public void setStudentEmail(String studentEmail) 
    {
        this.studentEmail = studentEmail;
    }
//---------------------------------------------------------------------------
//  toString.
//---------------------------------------------------------------------------
    public String toString() 
    {
        return "---------------------------Student--------------------------- " +
                "\nStudent Name:" + studentName + 
                "\nStudent Id:"+ studentId + 
                "\nStudent Telephone Number:"+ studentTelephoneNumber + 
                "\nStudent Email:" + studentEmail;
    }
    void read(RandomAccessFile raf) throws IOException 
    {
        char[] temp = new char[15];
        for (int i = 0; i < temp.length; i++)
          temp[i] = raf.readChar();
        studentName = new String(temp);
        temp = new char[15];
        for (int i = 0; i < temp.length; i++)
          temp[i] = raf.readChar();
        studentId = new String(temp);
        temp = new char[30];
        for (int i = 0; i < temp.length; i++)
          temp[i] = raf.readChar();
        studentEmail = new String(temp);
        temp = new char[30];
        for (int i = 0; i < temp.length; i++)
              temp[i] = raf.readChar();
        studentTelephoneNumber = new String(temp);
        temp = new char[30];
        for (int i = 0; i < temp.length; i++)
              temp[i] = raf.readChar();
      }

      void write(RandomAccessFile raf) throws IOException 
      {
        StringBuffer sb;
        if (studentName != null)
          sb = new StringBuffer(studentName);
        else
          sb = new StringBuffer();

        sb.setLength(15);
        raf.writeChars(sb.toString());

        if (studentId != null)
          sb = new StringBuffer(studentId);
        else
          sb = new StringBuffer();

        sb.setLength(15);
        raf.writeChars(sb.toString());

        if (studentEmail != null)
          sb = new StringBuffer(studentEmail);
        else
          sb = new StringBuffer();

        sb.setLength(30);
        raf.writeChars(sb.toString());
        if (studentTelephoneNumber != null)
              sb = new StringBuffer(studentTelephoneNumber);
            else
              sb = new StringBuffer();

            sb.setLength(30);
            raf.writeChars(sb.toString());

      }



}
Was it helpful?

Solution

The basic problem is that you are reading more data than you are writing.

You are reading 30 char at the end of each record which you didn't write. Given you discard them it appears you don't need to be doing this. I would delete the code which reads after studentTelephoneNumber

OTHER TIPS

You are reading beyond the end of the file. Reading data that isn't there.

If load just one detail do you get the problem? I think your problem is that you are reading off the end of the file. Your read function which reads 15/30 characters seem dangerous because you may not have written that much. Why not read until you get a comma or some other separator? (eg tab)

It's this sort of thing that looks dangerous

char[] temp = new char[15]; 
for (int i = 0; i < temp.length; i++) 
    temp[i] = raf.readChar(); 

Where does the 15 come from?

Try and break it down with just one detail and bulid up from there. You should find the error. I would personally read until you find a particular separator.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top