Еще один способ написать ученикам с помощью RandomAccessFile без статического массива

Я делаю приложение, которое хранит данные о студентах в файле с использованием RandomAccessFile, но единственный способ, которым я добился этого, - это добавить студентов магазина a, b, c, d, e и т. д.... в статический массив и использовать getBytes метод его записи. Хранилище сделано с использованием arrayList. Я пробовал много вещей и много методов, и я не могу понять это без использования статического массива.

Вот мой код:

Основное приложение

import java.io.IOException;
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", "[email protected]");
        Student b = new Student("Fabio Borini", "DKIT28", "0876136944", "[email protected]");
        Student c = new Student("Gaston Ramirez", "DKIT29", "0419834501", "[email protected]");
        Student d = new Student("Luis Suarez", "DKIT7", "0868989878", "[email protected]");
        Student e = new Student("Andy Carroll", "DKIT9", "0853456788", "[email protected]");
        details.add(a);
        details.add(b);
        details.add(c);
        details.add(d);
        details.add(e);
        //details.print();


        RandomAccessFile file = new RandomAccessFile("ContactDetails.txt","rw");
        //getBytes() returns an array of bytes.
        //Because i have put the store in a static Array.(I done this because i could find no other
        //Simple way to write a Student Object.)
        //None of the methods of the RandomAccessFile write class worked with this.
        Student[] students = {a,b,c,d,e};
        details.write(students, file);
        details.readAll(file);



        file.close();


     }


 }

СтудентМагазин

//---------------------------------------------------------------------------
//Imports.
//---------------------------------------------------------------------------   
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
//---------------------------------------------------------------------------   

public class StudentStore
{
//---------------------------------------------------------------------------
//ArrayList declaration.
//---------------------------------------------------------------------------
    List<Student> students = new ArrayList<Student>();
//---------------------------------------------------------------------------
//Name:          Add method.
//Description:   Adds a student to the ArrayList.
//---------------------------------------------------------------------------
    public void add(Student student) 
    {
        students.add(student);
    }
//---------------------------------------------------------------------------
//Name:          DeleteAll method.
//Description:   Delete's everything in the ArrayList.
    //---------------------------------------------------------------------------
     public void deleteAll()
     {
           students.clear();
     }
//---------------------------------------------------------------------------
//Name:          Print method.
//Description:   Prints out the contents of the ArrayList.
//---------------------------------------------------------------------------
    public void print() 
    {
        for (int i = 0; i < students.size(); i++) 
        {
          Student a = students.get(i);
            System.out.println(a.toString());
        }
    }
    public int size()
    {
        return (students == null) ? 0 : students.size();
    }
    public void write(Student[] students, RandomAccessFile file) throws IOException
    {
        for (int i = 0; i < students.length; i++)
        {
        byte[] bytes = students[i].toString().getBytes();
        for(byte byteWrite : bytes)
        {
            file.writeByte(byteWrite);
        }
        }

    }
    public void readAll(RandomAccessFile file) throws IOException
    {
        final int Record_Length = 30;
        int recordNumber = 0;
        file.seek((recordNumber) * Record_Length);

        String code ="";
        for(int i = 0; i < 30; i++)
        {
        code += file.readLine() + "\n";
        }
        System.out.println(code);
    }

}

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


person Pendo826    schedule 08.08.2012    source источник
comment
Другой способ записать студентов из хранилища ArrayList без использования статического массива, который я показал выше.   -  person Pendo826    schedule 09.08.2012
comment
почему вы не можете просто использовать массив студентов, который находится внутри StudentStore? Почему вы должны передать этот массив?   -  person jeff    schedule 09.08.2012
comment
Потому что ни один из методов в RandomAccessFile не позволяет передавать ArrayList в качестве параметра.   -  person Pendo826    schedule 09.08.2012


Ответы (1)


Вы можете пометить Student как реализующий Serializable, так как он просто хранит кучу текста. Затем вы можете получить байты из вашего List<Student> students для хранения следующим образом:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(students);
out.close();

byte[] bytes = bos.toByteArray();

затем вы можете извлечь его обратно из файла, прочитав байты в файле в массив байтов, а затем выполнив:

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
students = (List<Student>) in.readObject();
in.close();

Изменить: просто напишите Student.toSting() как байты, которые вы могли бы сделать:

public void write(RandomAccessFile file) throws IOException
{
    for (Student s: students)
    {
        byte[] bytes = s.toString().getBytes();
        for(byte byteWrite : bytes)
        {
            file.writeByte(byteWrite);
        }
    }

}
person SamYonnou    schedule 08.08.2012
comment
Я не могу заставить его работать, как этот человек. Есть ли способ позволить пользователю добавлять студентов в Arraylist, а затем статический массив, чтобы распечатать его? - person Pendo826; 09.08.2012
comment
Ну, то, что вы делаете сейчас, это students[i].toString().getBytes(), поэтому с ArrayList вы можете просто сделать students.get(i).toString().getBytes() для того же результата. (см. мое редактирование) - person SamYonnou; 09.08.2012
comment
Я имею в виду ваш метод записи. Попробуйте использовать метод write, который я разместил в редактировании ответа, а в вашем методе start() просто выполните details.write(file) - person SamYonnou; 09.08.2012
comment
Ок круто. Кроме того, RandomAccessFile имеет метод write(byte[]), поэтому вам не нужно просматривать массив byte в цикле и делать writeByte(byte) индивидуально, я думаю. - person SamYonnou; 09.08.2012