java - 使用随机访问文件的 EOFException

标签 java file-io arraylist random-access eofexception

我正在使用随机访问文件来编写一个使用 arrayList 存储的 raf。我不知道它是否可以完成,但我正在试一试,因为它是我创建此应用程序的最佳解决方案。

这是我遇到的运行时错误:

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)

这是我的代码:

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() + " ");
            }

          }

学生

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());

      }



}

最佳答案

您正在阅读超出文件末尾的内容。读取不存在的数据。

关于java - 使用随机访问文件的 EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828469/

相关文章:

java - 如何正确创建 AsyncTask

java - 使用 JAXB 解码/编码 List<String>

java - 配置 Spring MVC Controller 以将文件发送到客户端

用于防止重复订单的 Java 同步选项(文件、数据库锁定?)

java - 测试用 Java 写入文件的方法

java - 初始化 List<E> 数组时抛出 IndexofBoundsException

java - 如何在 JLabel 中设置填充

javascript - 链接和获取自定义输出 mysql

java - JSoup 似乎忽略字符代码?

java - 在 ArrayList 中设置元素的值时是否需要同步